@dataramen/cli 0.0.5 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- "use strict";var tt=Object.create;var ee=Object.defineProperty;var rt=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var st=Object.getPrototypeOf,ot=Object.prototype.hasOwnProperty;var W=(a,e)=>()=>(e||a((e={exports:{}}).exports,e),e.exports);var nt=(a,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of at(e))!ot.call(a,s)&&s!==t&&ee(a,s,{get:()=>e[s],enumerable:!(r=rt(e,s))||r.enumerable});return a};var _=(a,e,t)=>(t=a!=null?tt(st(a)):{},nt(e||!a||!a.__esModule?ee(t,"default",{value:a,enumerable:!0}):t,a));var De=W(Oe=>{"use strict";Object.defineProperty(Oe,"__esModule",{value:!0})});var Ne=W(D=>{"use strict";Object.defineProperty(D,"__esModule",{value:!0});D.SQLManipulator=D.SQLBuilder=D.SQLParser=void 0;var v=class{constructor(e="mysql"){this.dialect=e}parse(e){let r=e.trim().replace(/;$/,"").replace(/\s+/g," "),s=r.toUpperCase(),o;if(s.startsWith("SELECT"))o=this.parseSelect(r);else if(s.startsWith("INSERT"))o=this.parseInsert(r);else if(s.startsWith("UPDATE"))o=this.parseUpdate(r);else if(s.startsWith("DELETE"))o=this.parseDelete(r);else throw new Error("Unsupported SQL statement type");return o.parameters=this.extractParameters(r),o}extractParameters(e){let t=/:(\w+)/g,r=[],s;for(;(s=t.exec(e))!==null;){let o=s[1];r.includes(o)||r.push(o)}return r}parseSelect(e){let t={type:"SELECT"},{cleanedSQL:r,subqueries:s}=this.extractSubqueries(e),o=r.match(/SELECT\s+(.*?)\s+FROM/i);if(o){let p=o[1].trim();t.columns=p==="*"?["*"]:this.parseColumns(p)}let n=r.match(/FROM\s+([^\s]+)(?:\s|$)/i);if(n&&(t.table=n[1]),!t.table){let p=r.match(/FROM\s+([^\s]+)(?:\s+(?:AS\s+)?([^\s]+))?(?:\s+(?:WHERE|JOIN|INNER|LEFT|RIGHT|FULL|GROUP|ORDER|LIMIT|OFFSET|HAVING)|$)/i);p&&(t.table=p[1])}t.joins=this.parseJoins(r);let c=r.match(/WHERE\s+(.*?)(?:\s+GROUP\s+BY|\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/i);c&&(t.where=this.restoreSubqueries(c[1].trim(),s));let i=r.match(/ORDER\s+BY\s+(.*?)(?:\s+LIMIT|\s+OFFSET|$)/i);i&&(t.orderBy=this.parseOrderBy(i[1]));let d=r.match(/GROUP\s+BY\s+(.*?)(?:\s+HAVING|\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/i);d&&(t.groupBy=this.parseColumns(d[1]));let l=r.match(/HAVING\s+(.*?)(?:\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/i);l&&(t.having=this.restoreSubqueries(l[1].trim(),s));let T=r.match(/LIMIT\s+(\d+)/i);T&&(t.limit=parseInt(T[1]));let m=r.match(/OFFSET\s+(\d+)/i);return m&&(t.offset=parseInt(m[1])),t}parseColumns(e){let t=[],r="",s=!1,o="",n=0;for(let c=0;c<e.length;c++){let i=e[c];!s&&(i==='"'||i==="'")?(s=!0,o=i,r+=i):s&&i===o?c+1<e.length&&e[c+1]===o?(r+=i+i,c++):(s=!1,o="",r+=i):!s&&i==="("?(n++,r+=i):!s&&i===")"?(n--,r+=i):!s&&i===","&&n===0?(t.push(r.trim()),r=""):r+=i}return r.trim()&&t.push(r.trim()),t}extractSubqueries(e){let t=new Map,r=e,s=0,o=/\(([^()]*(?:SELECT|INSERT|UPDATE|DELETE)[^()]*(?:\([^()]*\)[^()]*)*)\)/gi,n=!0;for(;n;)n=!1,r=r.replace(o,(c,i)=>{if(/\b(SELECT|INSERT|UPDATE|DELETE)\b/i.test(i)){let d=`__SUBQUERY_${s}__`;return t.set(d,c),s++,n=!0,d}return c});return{cleanedSQL:r,subqueries:t}}restoreSubqueries(e,t){let r=e;return t.forEach((s,o)=>{r=r.replace(new RegExp(o,"g"),s)}),r}parseJoins(e){let t=[],r=/((?:INNER|LEFT|RIGHT|FULL)?\s*JOIN)\s+(\w+(?:\s+\w+)?)\s+ON\s+(.*?)(?=\s+(?:INNER|LEFT|RIGHT|FULL)?\s*JOIN|\s+WHERE|\s+GROUP\s+BY|\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/gi,s;for(;(s=r.exec(e))!==null;){let o=s[1].trim().toUpperCase(),n=s[2].trim(),c=s[3].trim(),i=n.split(/\s+/),d=i[0],l=i.length>1?i[1]:void 0,T;o.includes("LEFT")?T="LEFT":o.includes("RIGHT")?T="RIGHT":o.includes("FULL")?T="FULL":T="INNER",t.push({type:T,table:d,alias:l,on:c})}return t.length>0?t:[]}parseInsert(e){let t={type:"INSERT"},r=e.match(/INSERT\s+INTO\s+(\w+)\s*\(([^)]+(?:\([^)]*\)[^)]*)*)\)\s*VALUES\s*\((.+)\)\s*;?$/i);return r&&(t.table=r[1],t.columns=this.parseColumns(r[2]),t.values=this.parseColumns(r[3])),t}parseUpdate(e){let t={type:"UPDATE"},r=e.match(/UPDATE\s+(\w+)\s+SET\s+(.*?)(?:\s+WHERE|$)/i);r&&(t.table=r[1],t.set=this.parseSetClause(r[2]));let s=e.match(/WHERE\s+(.*?)$/i);return s&&(t.where=s[1].trim()),t}parseDelete(e){let t={type:"DELETE"},r=e.match(/DELETE\s+FROM\s+(\w+)(?:\s+WHERE\s+(.*?))?$/i);return r&&(t.table=r[1],r[2]&&(t.where=r[2].trim())),t}parseOrderBy(e){return e.split(",").map(r=>{let s=r.trim().split(" "),o=s.pop();return o==="DESC"||o==="desc"?{column:s.join(" "),direction:"DESC"}:o==="ASC"||o==="asc"?{column:s.join(" "),direction:"ASC"}:{column:s.join(" ")+" "+o,direction:"ASC"}})}parseSetClause(e){let t={};return this.parseColumns(e).forEach(s=>{let o=s.indexOf("=");if(o>0){let n=s.substring(0,o).trim(),c=s.substring(o+1).trim();t[n]=c}}),t}};D.SQLParser=v;var F=class{constructor(e,t="mysql"){this.parsed={...e},this.dialect=t}build(){switch(this.parsed.type){case"SELECT":return this.buildSelect();case"INSERT":return this.buildInsert();case"UPDATE":return this.buildUpdate();case"DELETE":return this.buildDelete();default:throw new Error("Unsupported SQL type")}}buildSelect(){let e="SELECT ";if(this.parsed.columns&&this.parsed.columns.length>0?e+=this.parsed.columns.join(", "):e+="*",this.parsed.table&&(e+=` FROM ${this.parsed.table}`),this.parsed.joins&&this.parsed.joins.length>0&&this.parsed.joins.forEach(t=>{e+=` ${t.type} JOIN ${t.table} ON ${t.on}`}),this.parsed.where&&(e+=` WHERE ${this.parsed.where}`),this.parsed.groupBy&&this.parsed.groupBy.length>0&&(e+=` GROUP BY ${this.parsed.groupBy.join(", ")}`),this.parsed.having&&(e+=` HAVING ${this.parsed.having}`),this.parsed.orderBy&&this.parsed.orderBy.length>0){let t=this.parsed.orderBy.reduce((s,o)=>(s[o.column]=o.direction,s),{}),r=Object.entries(t).map(([s,o])=>`${s} ${o}`);e+=` ORDER BY ${r.join(", ")}`}return this.parsed.limit!==void 0&&(e+=` LIMIT ${this.parsed.limit}`),this.parsed.offset!==void 0&&(this.dialect==="mysql"?e+=` OFFSET ${this.parsed.offset}`:e+=` OFFSET ${this.parsed.offset}`),e}buildInsert(){if(!this.parsed.table||!this.parsed.columns||!this.parsed.values)throw new Error("Invalid INSERT statement data");let e=this.parsed.columns.join(", "),t=this.parsed.values.join(", ");return`INSERT INTO ${this.parsed.table} (${e}) VALUES (${t})`}buildUpdate(){if(!this.parsed.table||!this.parsed.set)throw new Error("Invalid UPDATE statement data");let e=Object.entries(this.parsed.set).map(([r,s])=>`${r} = ${s}`),t=`UPDATE ${this.parsed.table} SET ${e.join(", ")}`;return this.parsed.where&&(t+=` WHERE ${this.parsed.where}`),t}buildDelete(){if(!this.parsed.table)throw new Error("Invalid DELETE statement data");let e=`DELETE FROM ${this.parsed.table}`;return this.parsed.where&&(e+=` WHERE ${this.parsed.where}`),e}};D.SQLBuilder=F;var X=class{constructor(e,t="mysql"){this.dialect=t,this.parser=new v(t),this.parsed=this.parser.parse(e),this.parameters={}}setParameter(e,t){return this.parameters[e]=t,this}setParameters(e){return this.parameters={...this.parameters,...e},this}getParameter(e){return this.parameters[e]}getParameters(){return{...this.parameters}}clearParameters(){return this.parameters={},this}getRequiredParameters(){return this.parsed.parameters||[]}getMissingParameters(){let e=this.getRequiredParameters(),t=Object.keys(this.parameters);return e.filter(r=>!t.includes(r))}addWhereWithParam(e,t,r,s="AND"){let o=this.buildWhereConditionWithParam(e,t,r);return this.parsed.where?this.parsed.where+=` ${s} ${o}`:this.parsed.where=o,this.parsed.parameters||(this.parsed.parameters=[]),this.parsed.parameters.includes(r)||this.parsed.parameters.push(r),this}addWhere(e){let t=this.buildWhereCondition(e);if(this.parsed.where){let r=e.connector||"AND";this.parsed.where+=` ${r} ${t}`}else this.parsed.where=t;return this}addWhereRaw(e,t="AND"){return this.parsed.where?this.parsed.where+=` ${t} ${e}`:this.parsed.where=e,this}clearWhere(){return this.parsed.where=void 0,this}addOrderBy(...e){return this.parsed.orderBy||(this.parsed.orderBy=[]),this.parsed.orderBy.push(...e),this}clearOrderBy(){return this.parsed.orderBy=void 0,this}setLimit(e){return this.parsed.limit=e,this}setOffset(e){return this.parsed.offset=e,this}addGroupBy(e){this.parsed.groupBy||(this.parsed.groupBy=[]);let t=this.parsed.groupBy.findIndex(r=>r===e);return t>-1?this.parsed.groupBy[t]=e:this.parsed.groupBy.push(e),this}setHaving(e){return this.parsed.having=e,this}addJoin(...e){if(this.parsed.type!=="SELECT")throw new Error("JOIN operations are only supported for SELECT queries");return this.parsed.joins||(this.parsed.joins=[]),this.parsed.joins.push(...e),this}selectColumns(e){if(this.parsed.type!=="SELECT")throw new Error("Column selection is only supported for SELECT queries");return this.parsed.columns=e,this}toSQL(e=!1,t=!1){let s=new F(this.parsed,this.dialect).build();return e&&(s=this.substituteParameters(s)),t&&(s+=";"),s}toParameterizedSQL(e=!1){let r=new F(this.parsed,this.dialect).build();return e?r+";":r}toExecutableSQL(e=!1){return this.toSQL(!0,e)}substituteParameters(e){let t=e;return Object.entries(this.parameters).forEach(([r,s])=>{let o=new RegExp(`:${r}\\b`,"g"),n=this.formatParameterValue(s);t=t.replace(o,n)}),t}formatParameterValue(e){return e==null?"NULL":typeof e=="string"?e:typeof e=="boolean"?this.dialect==="postgres"?e?"TRUE":"FALSE":e?"1":"0":Array.isArray(e)?`(${e.map(r=>this.formatParameterValue(r)).join(", ")})`:e instanceof Date?`'${e.toISOString().slice(0,19).replace("T"," ")}'`:String(e)}buildWhereConditionWithParam(e,t,r){switch(t){case"IS NULL":case"IS NOT NULL":return`${e} ${t}`;case"IN":case"NOT IN":return`${e} ${t} :${r}`;default:return`${e} ${t} :${r}`}}getParsed(){return{...this.parsed}}buildWhereCondition(e){let{column:t,operator:r,value:s}=e;switch(r){case"IS NULL":case"IS NOT NULL":return`${t} ${r}`;case"IN":case"NOT IN":let o=s?.map(i=>typeof i=="string"?`'${i}'`:i).join(", ");return`${t} ${r} (${o})`;default:let n=s?.[0],c=typeof n=="string"?`'${n}'`:n;return`${t} ${r} ${c}`}}};D.SQLManipulator=X});var qe=W(N=>{"use strict";var Rt=N&&N.__createBinding||(Object.create?function(a,e,t,r){r===void 0&&(r=t);var s=Object.getOwnPropertyDescriptor(e,t);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(a,r,s)}:function(a,e,t,r){r===void 0&&(r=t),a[r]=e[t]}),ke=N&&N.__exportStar||function(a,e){for(var t in a)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&Rt(e,a,t)};Object.defineProperty(N,"__esModule",{value:!0});ke(De(),N);ke(Ne(),N)});var $=require("dotenv"),Q=require("node:path"),te=require("node:fs"),it=(()=>{try{let a=(0,te.readFileSync)((0,Q.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(a)}catch{return{version:"0.0.0"}}})();(0,$.config)({path:[(0,Q.join)(__dirname,"..","env",".env"),(0,Q.join)(__dirname,"..","env",".env.default")]});(0,$.populate)(process.env,{SERVER_VERSION:it.version});var Ke=_(require("fastify")),Ze=_(require("@fastify/cors"));var u=class extends Error{constructor(t,r){super(r);this.status=t;this.message=r}};var ue=require("typeorm");var re=require("typeorm"),j=new re.EntitySchema({name:"DatabaseInspection",tableName:"db_inspection",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},tableName:{nullable:!0,type:String},columns:{type:"json",nullable:!0},createdAt:{type:"datetime",default:"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:"CURRENT_TIMESTAMP"}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var ae=require("typeorm"),H=new ae.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"}},relations:{users:{type:"many-to-many",target:()=>"User",inverseSide:"teams"},workbooks:{type:"one-to-many",target:()=>"Workbook",inverseSide:"team"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"team"},datasources:{type:"one-to-many",target:()=>"DataSource",inverseSide:"team"}}});var se=require("typeorm"),Y=new se.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:"datetime",default:"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:"CURRENT_TIMESTAMP"}},relations:{teams:{type:"many-to-many",target:()=>"Team",inverseSide:"users",joinTable:!0},settings:{type:"one-to-one",target:()=>"UserSettings",inverseSide:"user",joinColumn:!0},currentTeam:{type:"many-to-one",target:()=>"Team",joinColumn:!0}}});var oe=require("typeorm"),G=new oe.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},openAiToken:{type:String,nullable:!0},model:{type:String,default:"gpt-3.5-turbo"},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var ne=require("typeorm"),V=new ne.EntitySchema({name:"Workbook",tableName:"workbooks",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},path:{type:"uuid",generated:"uuid"},isTrash:{type:"boolean",default:!1},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"workbooks",joinColumn:!0}}});var ie=require("typeorm"),z=new ie.EntitySchema({name:"DataSource",tableName:"data_sources",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},dbUrl:{type:String},dbPort:{type:Number,nullable:!0},dbUser:{type:String},dbPassword:{type:String,nullable:!0},dbType:{type:String},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},name:{type:String},description:{type:String,nullable:!0},dbDatabase:{type:String},dbSchema:{type:String,nullable:!0},lastInspected:{type:"datetime",nullable:!0,default:()=>null},status:{type:String,nullable:!0}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"datasources",joinColumn:!0},inspections:{type:"one-to-many",target:()=>"DatabaseInspection",inverseSide:"datasource"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"dataSource"},owner:{type:"many-to-one",target:()=>"User",joinColumn:!0}}});var de=_(require("os"));var ce=require("typeorm"),J=new ce.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",default:"{}"},isTrash:{type:Boolean,default:!1,nullable:!0},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"workbooks",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",inverseSide:"queries",joinColumn:!0}}});function ct(){let a=process.env.TYPEORM_DATABASE;if(!a)throw new Error("Bad value for TYPEORM_DATABASE. Please check your config!");return a.startsWith("<home>")&&(a=a.replace("<home>",de.default.homedir())),a}var w=new ue.DataSource({type:process.env.TYPEORM_CONNECTION,database:ct(),synchronize:process.env.TYPEORM_SYNCHRONIZE==="true",host:process.env.TYPEORM_HOST,username:process.env.TYPEORM_USERNAME,password:process.env.TYPEORM_PASSWORD,port:process.env.TYPEORM_PORT?parseInt(process.env.TYPEORM_PORT):void 0,logging:process.env.TYPEORM_LOGGING==="true",entities:[j,z,H,Y,G,V,J]}),me=async()=>{if(!w.isInitialized)return w.initialize();throw new Error("Already initialized")},A=w.getRepository(j),h=w.getRepository(z),k=w.getRepository(H),R=w.getRepository(Y),P=w.getRepository(G),S=w.getRepository(V),I=w.getRepository(J);var x=_(require("node:fs/promises")),K=require("node:path"),pe=_(require("node:os")),ut=pe.default.homedir(),Z=(0,K.join)(ut,".dataramen",".runtime","files"),le=a=>(0,K.join)(Z,a),fe=async a=>x.default.readFile(le(a),{encoding:"utf8"}),ye=async(a,e)=>x.default.writeFile(le(a),e,{encoding:"utf8"});var he=async()=>{await dt()||await x.default.mkdir(Z,{recursive:!0})};async function dt(){try{return(await x.default.lstat(Z)).isDirectory()}catch{return!1}}var f=a=>(e,t,r)=>{a(e),r()};var ge=f(a=>{a.post("/workbook",async e=>({data:""}))});var y=(a,e)=>{let t=a.body;return e&&e(t),t},q=(a,e)=>{let t=a.query;return e&&e(t),t},g=(a,e)=>{let t=a.params;return e&&e(t),t};var O=a=>a.headers["phoenix-user-id"];var Te=a=>{if(!a.dbUrl)throw new u(400,"url is required");if(!a.dbUser)throw new u(400,"user is required");if(!a.dbType)throw new u(400,"type is required");if(!a.name)throw new u(400,"name is required");if(!a.dbDatabase)throw new u(400,"database is required")};var Ee=_(require("mysql2/promise"));var pt=({dbDatabase:a,dbPassword:e,dbUser:t,dbUrl:r})=>Ee.default.createConnection({host:r,user:t,database:a,password:e}),lt=async a=>{let e=`
1
+ "use strict";var tt=Object.create;var ee=Object.defineProperty;var rt=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var st=Object.getPrototypeOf,ot=Object.prototype.hasOwnProperty;var W=(a,e)=>()=>(e||a((e={exports:{}}).exports,e),e.exports);var nt=(a,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of at(e))!ot.call(a,s)&&s!==t&&ee(a,s,{get:()=>e[s],enumerable:!(r=rt(e,s))||r.enumerable});return a};var P=(a,e,t)=>(t=a!=null?tt(st(a)):{},nt(e||!a||!a.__esModule?ee(t,"default",{value:a,enumerable:!0}):t,a));var De=W(_e=>{"use strict";Object.defineProperty(_e,"__esModule",{value:!0})});var Ne=W(D=>{"use strict";Object.defineProperty(D,"__esModule",{value:!0});D.SQLManipulator=D.SQLBuilder=D.SQLParser=void 0;var v=class{constructor(e="mysql"){this.dialect=e}parse(e){let r=e.trim().replace(/;$/,"").replace(/\s+/g," "),s=r.toUpperCase(),o;if(s.startsWith("SELECT"))o=this.parseSelect(r);else if(s.startsWith("INSERT"))o=this.parseInsert(r);else if(s.startsWith("UPDATE"))o=this.parseUpdate(r);else if(s.startsWith("DELETE"))o=this.parseDelete(r);else throw new Error("Unsupported SQL statement type");return o.parameters=this.extractParameters(r),o}extractParameters(e){let t=/:(\w+)/g,r=[],s;for(;(s=t.exec(e))!==null;){let o=s[1];r.includes(o)||r.push(o)}return r}parseSelect(e){let t={type:"SELECT"},{cleanedSQL:r,subqueries:s}=this.extractSubqueries(e),o=r.match(/SELECT\s+(.*?)\s+FROM/i);if(o){let p=o[1].trim();t.columns=p==="*"?["*"]:this.parseColumns(p)}let n=r.match(/FROM\s+([^\s]+)(?:\s|$)/i);if(n&&(t.table=n[1]),!t.table){let p=r.match(/FROM\s+([^\s]+)(?:\s+(?:AS\s+)?([^\s]+))?(?:\s+(?:WHERE|JOIN|INNER|LEFT|RIGHT|FULL|GROUP|ORDER|LIMIT|OFFSET|HAVING)|$)/i);p&&(t.table=p[1])}t.joins=this.parseJoins(r);let c=r.match(/WHERE\s+(.*?)(?:\s+GROUP\s+BY|\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/i);c&&(t.where=this.restoreSubqueries(c[1].trim(),s));let i=r.match(/ORDER\s+BY\s+(.*?)(?:\s+LIMIT|\s+OFFSET|$)/i);i&&(t.orderBy=this.parseOrderBy(i[1]));let d=r.match(/GROUP\s+BY\s+(.*?)(?:\s+HAVING|\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/i);d&&(t.groupBy=this.parseColumns(d[1]));let l=r.match(/HAVING\s+(.*?)(?:\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/i);l&&(t.having=this.restoreSubqueries(l[1].trim(),s));let T=r.match(/LIMIT\s+(\d+)/i);T&&(t.limit=parseInt(T[1]));let m=r.match(/OFFSET\s+(\d+)/i);return m&&(t.offset=parseInt(m[1])),t}parseColumns(e){let t=[],r="",s=!1,o="",n=0;for(let c=0;c<e.length;c++){let i=e[c];!s&&(i==='"'||i==="'")?(s=!0,o=i,r+=i):s&&i===o?c+1<e.length&&e[c+1]===o?(r+=i+i,c++):(s=!1,o="",r+=i):!s&&i==="("?(n++,r+=i):!s&&i===")"?(n--,r+=i):!s&&i===","&&n===0?(t.push(r.trim()),r=""):r+=i}return r.trim()&&t.push(r.trim()),t}extractSubqueries(e){let t=new Map,r=e,s=0,o=/\(([^()]*(?:SELECT|INSERT|UPDATE|DELETE)[^()]*(?:\([^()]*\)[^()]*)*)\)/gi,n=!0;for(;n;)n=!1,r=r.replace(o,(c,i)=>{if(/\b(SELECT|INSERT|UPDATE|DELETE)\b/i.test(i)){let d=`__SUBQUERY_${s}__`;return t.set(d,c),s++,n=!0,d}return c});return{cleanedSQL:r,subqueries:t}}restoreSubqueries(e,t){let r=e;return t.forEach((s,o)=>{r=r.replace(new RegExp(o,"g"),s)}),r}parseJoins(e){let t=[],r=/((?:INNER|LEFT|RIGHT|FULL)?\s*JOIN)\s+(\w+(?:\s+\w+)?)\s+ON\s+(.*?)(?=\s+(?:INNER|LEFT|RIGHT|FULL)?\s*JOIN|\s+WHERE|\s+GROUP\s+BY|\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/gi,s;for(;(s=r.exec(e))!==null;){let o=s[1].trim().toUpperCase(),n=s[2].trim(),c=s[3].trim(),i=n.split(/\s+/),d=i[0],l=i.length>1?i[1]:void 0,T;o.includes("LEFT")?T="LEFT":o.includes("RIGHT")?T="RIGHT":o.includes("FULL")?T="FULL":T="INNER",t.push({type:T,table:d,alias:l,on:c})}return t.length>0?t:[]}parseInsert(e){let t={type:"INSERT"},r=e.match(/INSERT\s+INTO\s+(\w+)\s*\(([^)]+(?:\([^)]*\)[^)]*)*)\)\s*VALUES\s*\((.+)\)\s*;?$/i);return r&&(t.table=r[1],t.columns=this.parseColumns(r[2]),t.values=this.parseColumns(r[3])),t}parseUpdate(e){let t={type:"UPDATE"},r=e.match(/UPDATE\s+(\w+)\s+SET\s+(.*?)(?:\s+WHERE|$)/i);r&&(t.table=r[1],t.set=this.parseSetClause(r[2]));let s=e.match(/WHERE\s+(.*?)$/i);return s&&(t.where=s[1].trim()),t}parseDelete(e){let t={type:"DELETE"},r=e.match(/DELETE\s+FROM\s+(\w+)(?:\s+WHERE\s+(.*?))?$/i);return r&&(t.table=r[1],r[2]&&(t.where=r[2].trim())),t}parseOrderBy(e){return e.split(",").map(r=>{let s=r.trim().split(" "),o=s.pop();return o==="DESC"||o==="desc"?{column:s.join(" "),direction:"DESC"}:o==="ASC"||o==="asc"?{column:s.join(" "),direction:"ASC"}:{column:s.join(" ")+" "+o,direction:"ASC"}})}parseSetClause(e){let t={};return this.parseColumns(e).forEach(s=>{let o=s.indexOf("=");if(o>0){let n=s.substring(0,o).trim(),c=s.substring(o+1).trim();t[n]=c}}),t}};D.SQLParser=v;var F=class{constructor(e,t="mysql"){this.parsed={...e},this.dialect=t}build(){switch(this.parsed.type){case"SELECT":return this.buildSelect();case"INSERT":return this.buildInsert();case"UPDATE":return this.buildUpdate();case"DELETE":return this.buildDelete();default:throw new Error("Unsupported SQL type")}}buildSelect(){let e="SELECT ";if(this.parsed.columns&&this.parsed.columns.length>0?e+=this.parsed.columns.join(", "):e+="*",this.parsed.table&&(e+=` FROM ${this.parsed.table}`),this.parsed.joins&&this.parsed.joins.length>0&&this.parsed.joins.forEach(t=>{e+=` ${t.type} JOIN ${t.table} ON ${t.on}`}),this.parsed.where&&(e+=` WHERE ${this.parsed.where}`),this.parsed.groupBy&&this.parsed.groupBy.length>0&&(e+=` GROUP BY ${this.parsed.groupBy.join(", ")}`),this.parsed.having&&(e+=` HAVING ${this.parsed.having}`),this.parsed.orderBy&&this.parsed.orderBy.length>0){let t=this.parsed.orderBy.reduce((s,o)=>(s[o.column]=o.direction,s),{}),r=Object.entries(t).map(([s,o])=>`${s} ${o}`);e+=` ORDER BY ${r.join(", ")}`}return this.parsed.limit!==void 0&&(e+=` LIMIT ${this.parsed.limit}`),this.parsed.offset!==void 0&&(this.dialect==="mysql"?e+=` OFFSET ${this.parsed.offset}`:e+=` OFFSET ${this.parsed.offset}`),e}buildInsert(){if(!this.parsed.table||!this.parsed.columns||!this.parsed.values)throw new Error("Invalid INSERT statement data");let e=this.parsed.columns.join(", "),t=this.parsed.values.join(", ");return`INSERT INTO ${this.parsed.table} (${e}) VALUES (${t})`}buildUpdate(){if(!this.parsed.table||!this.parsed.set)throw new Error("Invalid UPDATE statement data");let e=Object.entries(this.parsed.set).map(([r,s])=>`${r} = ${s}`),t=`UPDATE ${this.parsed.table} SET ${e.join(", ")}`;return this.parsed.where&&(t+=` WHERE ${this.parsed.where}`),t}buildDelete(){if(!this.parsed.table)throw new Error("Invalid DELETE statement data");let e=`DELETE FROM ${this.parsed.table}`;return this.parsed.where&&(e+=` WHERE ${this.parsed.where}`),e}};D.SQLBuilder=F;var X=class{constructor(e="mysql",t){this.dialect=e,this.parser=new v(e),this.parsed=t==="SELECT"?{type:"SELECT"}:this.parser.parse(t),this.parameters={}}setParameter(e,t){return this.parameters[e]=t,this}setParameters(e){return this.parameters={...this.parameters,...e},this}getParameter(e){return this.parameters[e]}getParameters(){return{...this.parameters}}clearParameters(){return this.parameters={},this}getRequiredParameters(){return this.parsed.parameters||[]}getMissingParameters(){let e=this.getRequiredParameters(),t=Object.keys(this.parameters);return e.filter(r=>!t.includes(r))}addWhereWithParam(e,t,r,s="AND"){let o=this.buildWhereConditionWithParam(e,t,r);return this.parsed.where?this.parsed.where+=` ${s} ${o}`:this.parsed.where=o,this.parsed.parameters||(this.parsed.parameters=[]),this.parsed.parameters.includes(r)||this.parsed.parameters.push(r),this}addWhere(e){let t=this.buildWhereCondition(e);if(this.parsed.where){let r=e.connector||"AND";this.parsed.where+=` ${r} ${t}`}else this.parsed.where=t;return this}addWhereRaw(e,t="AND"){return this.parsed.where?this.parsed.where+=` ${t} ${e}`:this.parsed.where=e,this}clearWhere(){return this.parsed.where=void 0,this}addOrderBy(...e){return this.parsed.orderBy||(this.parsed.orderBy=[]),this.parsed.orderBy.push(...e),this}clearOrderBy(){return this.parsed.orderBy=void 0,this}setLimit(e){return this.parsed.limit=e,this}setOffset(e){return this.parsed.offset=e,this}addGroupBy(e){this.parsed.groupBy||(this.parsed.groupBy=[]);let t=this.parsed.groupBy.findIndex(r=>r===e);return t>-1?this.parsed.groupBy[t]=e:this.parsed.groupBy.push(e),this}setHaving(e){return this.parsed.having=e,this}setTable(e){return this.parsed.table=e,this}addJoin(...e){if(this.parsed.type!=="SELECT")throw new Error("JOIN operations are only supported for SELECT queries");return this.parsed.joins||(this.parsed.joins=[]),this.parsed.joins.push(...e),this}selectColumns(e){if(this.parsed.type!=="SELECT")throw new Error("Column selection is only supported for SELECT queries");return this.parsed.columns=e,this}toSQL(e=!1,t=!1){let s=new F(this.parsed,this.dialect).build();return e&&(s=this.substituteParameters(s)),t&&(s+=";"),s}toParameterizedSQL(e=!1){let r=new F(this.parsed,this.dialect).build();return e?r+";":r}toExecutableSQL(e=!1){return this.toSQL(!0,e)}substituteParameters(e){let t=e;return Object.entries(this.parameters).forEach(([r,s])=>{let o=new RegExp(`:${r}\\b`,"g"),n=this.formatParameterValue(s);t=t.replace(o,n)}),t}formatParameterValue(e){return e==null?"NULL":typeof e=="string"?e:typeof e=="boolean"?this.dialect==="postgres"?e?"TRUE":"FALSE":e?"1":"0":Array.isArray(e)?`(${e.map(r=>this.formatParameterValue(r)).join(", ")})`:e instanceof Date?`'${e.toISOString().slice(0,19).replace("T"," ")}'`:String(e)}buildWhereConditionWithParam(e,t,r){switch(t){case"IS NULL":case"IS NOT NULL":return`${e} ${t}`;case"IN":case"NOT IN":return`${e} ${t} :${r}`;default:return`${e} ${t} :${r}`}}getParsed(){return{...this.parsed}}buildWhereCondition(e){let{column:t,operator:r,value:s}=e;switch(r){case"IS NULL":case"IS NOT NULL":return`${t} ${r}`;case"IN":case"NOT IN":let o=s?.map(i=>typeof i=="string"?`'${i}'`:i).join(", ");return`${t} ${r} (${o})`;default:let n=s?.[0],c=typeof n=="string"?`'${n}'`:n;return`${t} ${r} ${c}`}}};D.SQLManipulator=X});var qe=W(N=>{"use strict";var Rt=N&&N.__createBinding||(Object.create?function(a,e,t,r){r===void 0&&(r=t);var s=Object.getOwnPropertyDescriptor(e,t);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(a,r,s)}:function(a,e,t,r){r===void 0&&(r=t),a[r]=e[t]}),ke=N&&N.__exportStar||function(a,e){for(var t in a)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&Rt(e,a,t)};Object.defineProperty(N,"__esModule",{value:!0});ke(De(),N);ke(Ne(),N)});var $=require("dotenv"),Q=require("node:path"),te=require("node:fs"),it=(()=>{try{let a=(0,te.readFileSync)((0,Q.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(a)}catch{return{version:"0.0.0"}}})();(0,$.config)({path:[(0,Q.join)(__dirname,"..","env",".env"),(0,Q.join)(__dirname,"..","env",".env.default")]});(0,$.populate)(process.env,{SERVER_VERSION:it.version});var Je=P(require("fastify")),Ze=P(require("@fastify/cors"));var u=class extends Error{constructor(t,r){super(r);this.status=t;this.message=r}};var ue=require("typeorm");var re=require("typeorm"),j=new re.EntitySchema({name:"DatabaseInspection",tableName:"db_inspection",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},tableName:{nullable:!0,type:String},columns:{type:"json",nullable:!0},createdAt:{type:"datetime",default:"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:"CURRENT_TIMESTAMP"}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var ae=require("typeorm"),H=new ae.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"}},relations:{users:{type:"many-to-many",target:()=>"User",inverseSide:"teams"},workbooks:{type:"one-to-many",target:()=>"Workbook",inverseSide:"team"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"team"},datasources:{type:"one-to-many",target:()=>"DataSource",inverseSide:"team"}}});var se=require("typeorm"),Y=new se.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:"datetime",default:"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:"CURRENT_TIMESTAMP"}},relations:{teams:{type:"many-to-many",target:()=>"Team",inverseSide:"users",joinTable:!0},settings:{type:"one-to-one",target:()=>"UserSettings",inverseSide:"user",joinColumn:!0},currentTeam:{type:"many-to-one",target:()=>"Team",joinColumn:!0}}});var oe=require("typeorm"),G=new oe.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},openAiToken:{type:String,nullable:!0},model:{type:String,default:"gpt-3.5-turbo"},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var ne=require("typeorm"),V=new ne.EntitySchema({name:"Workbook",tableName:"workbooks",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},path:{type:"uuid",generated:"uuid"},isTrash:{type:"boolean",default:!1},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"workbooks",joinColumn:!0}}});var ie=require("typeorm"),z=new ie.EntitySchema({name:"DataSource",tableName:"data_sources",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},dbUrl:{type:String},dbPort:{type:Number,nullable:!0},dbUser:{type:String},dbPassword:{type:String,nullable:!0},dbType:{type:String},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},name:{type:String},description:{type:String,nullable:!0},dbDatabase:{type:String},dbSchema:{type:String,nullable:!0},lastInspected:{type:"datetime",nullable:!0,default:()=>null},status:{type:String,nullable:!0}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"datasources",joinColumn:!0},inspections:{type:"one-to-many",target:()=>"DatabaseInspection",inverseSide:"datasource"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"dataSource"},owner:{type:"many-to-one",target:()=>"User",joinColumn:!0}}});var de=P(require("os"));var ce=require("typeorm"),K=new ce.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",default:"{}"},isTrash:{type:Boolean,default:!1,nullable:!0},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"workbooks",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",inverseSide:"queries",joinColumn:!0}}});function ct(){let a=process.env.TYPEORM_DATABASE;if(!a)throw new Error("Bad value for TYPEORM_DATABASE. Please check your config!");return a.startsWith("<home>")&&(a=a.replace("<home>",de.default.homedir())),a}var E=new ue.DataSource({type:process.env.TYPEORM_CONNECTION,database:ct(),synchronize:process.env.TYPEORM_SYNCHRONIZE==="true",host:process.env.TYPEORM_HOST,username:process.env.TYPEORM_USERNAME,password:process.env.TYPEORM_PASSWORD,port:process.env.TYPEORM_PORT?parseInt(process.env.TYPEORM_PORT):void 0,logging:process.env.TYPEORM_LOGGING==="true",entities:[j,z,H,Y,G,V,K]}),me=async()=>{if(!E.isInitialized)return E.initialize();throw new Error("Already initialized")},A=E.getRepository(j),h=E.getRepository(z),k=E.getRepository(H),R=E.getRepository(Y),O=E.getRepository(G),S=E.getRepository(V),I=E.getRepository(K);var x=P(require("node:fs/promises")),J=require("node:path"),pe=P(require("node:os")),ut=pe.default.homedir(),Z=(0,J.join)(ut,".dataramen",".runtime","files"),le=a=>(0,J.join)(Z,a),fe=async a=>x.default.readFile(le(a),{encoding:"utf8"}),ye=async(a,e)=>x.default.writeFile(le(a),e,{encoding:"utf8"});var he=async()=>{await dt()||await x.default.mkdir(Z,{recursive:!0})};async function dt(){try{return(await x.default.lstat(Z)).isDirectory()}catch{return!1}}var f=a=>(e,t,r)=>{a(e),r()};var ge=f(a=>{a.post("/workbook",async e=>({data:""}))});var y=(a,e)=>{let t=a.body;return e&&e(t),t},q=(a,e)=>{let t=a.query;return e&&e(t),t},g=(a,e)=>{let t=a.params;return e&&e(t),t};var _=a=>a.headers["phoenix-user-id"];var Te=a=>{if(!a.dbUrl)throw new u(400,"url is required");if(!a.dbUser)throw new u(400,"user is required");if(!a.dbType)throw new u(400,"type is required");if(!a.name)throw new u(400,"name is required");if(!a.dbDatabase)throw new u(400,"database is required")};var we=P(require("mysql2/promise"));var pt=({dbDatabase:a,dbPassword:e,dbUser:t,dbUrl:r})=>we.default.createConnection({host:r,user:t,database:a,password:e}),lt=async a=>{let e=`
2
2
  SELECT TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION
3
3
  FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
4
4
  WHERE CONSTRAINT_NAME = 'PRIMARY'
@@ -14,7 +14,7 @@
14
14
  WHERE
15
15
  REFERENCED_TABLE_NAME IS NOT NULL
16
16
  AND CONSTRAINT_SCHEMA = DATABASE();
17
- `,[t]=await a.execute(e),r={};return Array.isArray(t)&&t.forEach(s=>{r[s.table_name]||(r[s.table_name]={}),r[s.table_name][s.field]={refTable:s.referenced_table,refField:s.referenced_field}}),r},yt=async(a,e)=>{let r=(await e.query("SHOW TABLES"))[0],s=await ft(e),o=await lt(e),n=r.map(async c=>{let i=Object.values(c)[0],d=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${a.dbDatabase}' and table_name = '${i}'`,[l]=await e.query(d),T=s[i];return{columns:l.map(m=>({name:m.COLUMN_NAME,type:m.DATA_TYPE,isPrimary:o[i]?.includes(m.COLUMN_NAME),ref:T?.[m.COLUMN_NAME]?{table:T[m.COLUMN_NAME].refTable,field:T[m.COLUMN_NAME].refField}:void 0})).sort((m,p)=>m.isPrimary&&p.isPrimary?m.name.localeCompare(p.name):m.isPrimary?-1:1),createdAt:new Date,tableName:i,updatedAt:new Date}});return Promise.all(n)},we=async(a,e,t)=>{try{console.log(`[MYSQL CONN] Query: ${a}`);let[r,s]=await e.query({sql:a,rowsAsArray:!0}),o=r?.constructor?.name;if(o==="ResultSetHeader"){let n=r;if(n.affectedRows>3&&t.allowBulkUpdate!==!0)throw new Error("[MYSQL CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[n.affectedRows]],query:a}}else if(o==="Array"){let n=r;return{columns:s?.map(c=>({column:c.orgName||c.name,table:c.orgTable,alias:c.name,full:c.orgTable?c.orgTable+"."+c.orgName:c.name}))||[],rows:n,query:a}}throw new Error(`[MYSQL CONN] Unknown result type: ${o}`)}catch(r){throw console.error(r),r instanceof u?r:new u(400,r.message)}},ht=async(a,e)=>{await a.beginTransaction();try{let t=await e();return await a.commit(),console.log("[MYSQL CONN] Commit"),t}catch(t){throw await a.rollback(),console.warn(t.message),console.log("[MYSQL CONN] Rollback"),t}},Se=async a=>{let e=await pt(a),t=!1;return{dbType:"mysql",dataSource:a,inspectSchema:()=>yt(a,e),executeQuery:(r,s)=>s.type==="SELECT"?we(r,e,s):ht(e,()=>we(r,e,s)),checkConnection:async()=>e.ping(),isClosed:()=>t,close:async()=>{if(!t)return t=!0,e.destroy()}}};var Re=_(require("pg"));var gt=async({dbDatabase:a,dbPassword:e,dbUser:t,dbUrl:r,dbPort:s})=>{let o=new Re.default.Client({host:r,user:t,database:a,password:e,port:s,query_timeout:1e4});return await o.connect(),o},Tt=async a=>{let t=await a.query(`
17
+ `,[t]=await a.execute(e),r={};return Array.isArray(t)&&t.forEach(s=>{r[s.table_name]||(r[s.table_name]={}),r[s.table_name][s.field]={refTable:s.referenced_table,refField:s.referenced_field}}),r},yt=async(a,e)=>{let r=(await e.query("SHOW TABLES"))[0],s=await ft(e),o=await lt(e),n=r.map(async c=>{let i=Object.values(c)[0],d=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${a.dbDatabase}' and table_name = '${i}'`,[l]=await e.query(d),T=s[i];return{columns:l.map(m=>({name:m.COLUMN_NAME,type:m.DATA_TYPE,isPrimary:o[i]?.includes(m.COLUMN_NAME),ref:T?.[m.COLUMN_NAME]?{table:T[m.COLUMN_NAME].refTable,field:T[m.COLUMN_NAME].refField}:void 0})).sort((m,p)=>m.isPrimary&&p.isPrimary?m.name.localeCompare(p.name):m.isPrimary?-1:1),createdAt:new Date,tableName:i,updatedAt:new Date}});return Promise.all(n)},Ee=async(a,e,t)=>{try{console.log(`[MYSQL CONN] Query: ${a}`);let[r,s]=await e.query({sql:a,rowsAsArray:!0}),o=r?.constructor?.name;if(o==="ResultSetHeader"){let n=r;if(n.affectedRows>3&&t.allowBulkUpdate!==!0)throw new Error("[MYSQL CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[n.affectedRows]],query:a}}else if(o==="Array"){let n=r;return{columns:s?.map(c=>({column:c.orgName||c.name,table:c.orgTable,alias:c.name,full:c.orgTable?c.orgTable+"."+c.orgName:c.name}))||[],rows:n,query:a}}throw new Error(`[MYSQL CONN] Unknown result type: ${o}`)}catch(r){throw console.error(r),r instanceof u?r:new u(400,r.message)}},ht=async(a,e)=>{await a.beginTransaction();try{let t=await e();return await a.commit(),console.log("[MYSQL CONN] Commit"),t}catch(t){throw await a.rollback(),console.warn(t.message),console.log("[MYSQL CONN] Rollback"),t}},Se=async a=>{let e=await pt(a),t=!1;return{dbType:"mysql",dataSource:a,inspectSchema:()=>yt(a,e),executeQuery:(r,s)=>s.type==="SELECT"?Ee(r,e,s):ht(e,()=>Ee(r,e,s)),checkConnection:async()=>e.ping(),isClosed:()=>t,close:async()=>{if(!t)return t=!0,e.destroy()}}};var Re=P(require("pg"));var gt=async({dbDatabase:a,dbPassword:e,dbUser:t,dbUrl:r,dbPort:s})=>{let o=new Re.default.Client({host:r,user:t,database:a,password:e,port:s,query_timeout:1e4});return await o.connect(),o},Tt=async a=>{let t=await a.query(`
18
18
  SELECT
19
19
  kcu.table_name,
20
20
  kcu.column_name,
@@ -28,7 +28,7 @@
28
28
  tc.constraint_type = 'PRIMARY KEY'
29
29
  ORDER BY
30
30
  kcu.table_name, kcu.ordinal_position;
31
- `),r={};return t.rows.forEach(s=>{let o=s.table_name,n=s.column_name;r[o]||(r[o]=[]),r[o].push(n)}),r},wt=async a=>{let t=await a.query(`
31
+ `),r={};return t.rows.forEach(s=>{let o=s.table_name,n=s.column_name;r[o]||(r[o]=[]),r[o].push(n)}),r},Et=async a=>{let t=await a.query(`
32
32
  SELECT
33
33
  tc.table_name AS table_name,
34
34
  kcu.column_name AS field,
@@ -43,21 +43,21 @@
43
43
  ON ccu.constraint_name = tc.constraint_name
44
44
  AND ccu.table_schema = tc.table_schema
45
45
  WHERE tc.constraint_type = 'FOREIGN KEY';
46
- `),r={};return t.rows.forEach(s=>{r[s.table_name]||(r[s.table_name]={}),r[s.table_name][s.field]={refTable:s.referenced_table,refField:s.referenced_field}}),r},Et=async(a,e)=>{let t=`SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = '${a.dbSchema}'`,s=(await e.query(t)).rows,o=await wt(e),n=await Tt(e),c=s.map(async i=>{let d=Object.values(i)[0],l=`
46
+ `),r={};return t.rows.forEach(s=>{r[s.table_name]||(r[s.table_name]={}),r[s.table_name][s.field]={refTable:s.referenced_table,refField:s.referenced_field}}),r},wt=async(a,e)=>{let t=`SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = '${a.dbSchema}'`,s=(await e.query(t)).rows,o=await Et(e),n=await Tt(e),c=s.map(async i=>{let d=Object.values(i)[0],l=`
47
47
  SELECT column_name, data_type
48
48
  FROM information_schema.columns
49
49
  WHERE
50
50
  table_name = '${d}' and
51
51
  table_schema = '${a.dbSchema}'
52
- `,{rows:T}=await e.query(l),m=o[d];return{columns:T.map(p=>({name:p.column_name,type:p.data_type,isPrimary:n[d]?.includes(p.column_name),ref:m?.[p.column_name]?{table:m[p.column_name].refTable,field:m[p.column_name].refField}:void 0})).sort((p,E)=>p.isPrimary&&E.isPrimary?p.name.localeCompare(E.name):p.isPrimary?-1:1),createdAt:new Date,tableName:d,updatedAt:new Date}});return Promise.all(c)},St=async(a,e)=>{let t=`select relname, attname, concat(pg_class.oid, '-', attnum) as row_key
52
+ `,{rows:T}=await e.query(l),m=o[d];return{columns:T.map(p=>({name:p.column_name,type:p.data_type,isPrimary:n[d]?.includes(p.column_name),ref:m?.[p.column_name]?{table:m[p.column_name].refTable,field:m[p.column_name].refField}:void 0})).sort((p,w)=>p.isPrimary&&w.isPrimary?p.name.localeCompare(w.name):p.isPrimary?-1:1),createdAt:new Date,tableName:d,updatedAt:new Date}});return Promise.all(c)},St=async(a,e)=>{let t=`select relname, attname, concat(pg_class.oid, '-', attnum) as row_key
53
53
  from pg_attribute
54
54
  left join pg_class on pg_attribute.attrelid = pg_class.oid
55
55
  where
56
56
  concat(pg_class.oid, '-', attnum) IN (${a.join(", ")})
57
- limit 25;`;return(await e.query(t)).rows.reduce((s,o)=>(s[o.row_key]={table:o.relname,column:o.attname},s),{})},be=async(a,e,t)=>{try{console.log(`[PG CONN] Query: ${a}`);let{rows:r,fields:s,command:o,rowCount:n}=await e.query({text:a,rowMode:"array"});if(o==="UPDATE"||o==="INSERT"||o==="DELETE"){if(n!=null&&n>3&&t.allowBulkUpdate!==!0)throw new Error("[PG CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[n]],query:a}}if(o==="SELECT"){let c=s.map(d=>`'${d.tableID}-${d.columnID}'`),i=await St(c,e);return{columns:s.map(d=>{let l=i[`${d.tableID}-${d.columnID}`];return{column:l?.column||d.name,alias:d.name,table:l?.table||"",full:l?l.table+"."+l.column:d.name}}),rows:r,query:a}}throw new Error(`[PG CONN] Unsupported command: ${o}`)}catch(r){throw r instanceof u?r:new u(400,r.message)}},bt=async(a,e)=>{await a.query("BEGIN");try{let t=await e();return await a.query("COMMIT"),console.log("[PG CONN] Commit"),t}catch(t){throw await a.query("ROLLBACK"),console.log("[PG CONN] Rollback"),t}},Ie=async a=>{let e=await gt(a),t=!1,r=!1,s=async o=>(r||await e.query(`SET search_path TO ${a.dbSchema}`),o());return{dbType:"postgres",dataSource:a,inspectSchema:()=>Et(a,e),executeQuery:(o,n)=>s(()=>n.type==="SELECT"?be(o,e,n):bt(e,()=>be(o,e,n))),checkConnection:async()=>{},isClosed:()=>t,close:async()=>{if(!t)return t=!0,e.end()}}};var M=async(a,e)=>{try{let t;if(a.dbType==="mysql")t=await Se(a);else if(a.dbType==="postgres")t=await Ie(a);else throw new u(500,`Connection manager for ${a.dbType} not found`);return e.__connections?e.__connections.push(t):e.__connections=[t],t}catch(t){throw console.error(t),t instanceof u?t:t?.code==="ECONNREFUSED"?new u(500,"Failed to connect to the database"):new u(500,t.message)}};var Ce=f(a=>{a.get("/:id",async e=>{let{id:t}=g(e),r=await h.findOne({where:{id:t}});if(!r)throw new u(404,"Data source not found");return{data:r}}),a.get("/",async e=>{let{teamId:t}=q(e);return{data:await h.find({where:{team:{id:t}},order:{createdAt:"DESC"}})}}),a.post("/",async(e,t)=>{let{teamId:r,ownerId:s,...o}=y(e,Te),n=h.create({...o,team:{id:r},owner:{id:s}}),c=await M(n,e);try{await c.checkConnection()}catch{throw new u(400,"Cannot connect to the database, please check datasource configuration")}return{data:await h.save(n)}}),a.put("/:id",async(e,t)=>{let{id:r}=g(e),s=y(e),o=await h.findOneBy({id:r});if(!o)throw new u(404,"Data source not found");let n=h.merge(o,s);return await h.save(n),{data:n}}),a.delete("/:id",async(e,t)=>w.transaction(async()=>{let{id:r}=g(e);await Promise.all([A.delete({datasource:{id:r}}),I.delete({dataSource:{id:r}})]),await h.delete({id:r})})),a.post("/:id/inspect",async(e,t)=>{let{id:r}=g(e),s=await h.findOneBy({id:r});if(!s)throw new Error("Data source not found");s.status="INSPECTING",await h.save(s);let n=await(await M(s,e)).inspectSchema();await A.delete({datasource:{id:r}}),await A.insert(n.sort().map(c=>A.create({tableName:c.tableName,columns:c.columns,datasource:{id:r}}))),s.status="READY",s.lastInspected=new Date,await h.save(s)}),a.get("/:id/inspections",async(e,t)=>{let{id:r}=g(e);return{data:await A.find({where:{datasource:{id:r}}})}})});var Ae=f(a=>{a.get("/team/:teamId/files",async(e,t)=>{let{teamId:r}=g(e),s={where:{team:{id:r}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0}},[o=[],n=[],c=[]]=await Promise.all([h.find(s),S.find({...s,where:{...s.where,isTrash:!1}}),I.find({...s,where:{...s.where,isTrash:!1}})]);return{data:[...o.map(i=>({...i,type:"dataSource"})),...n.map(i=>({...i,type:"workbook"})),...c.map(i=>({...i,type:"query"}))]}}),a.get("/team/:teamId/trash",async e=>{let{teamId:t}=g(e);return{data:await w.query(`
57
+ limit 25;`;return(await e.query(t)).rows.reduce((s,o)=>(s[o.row_key]={table:o.relname,column:o.attname},s),{})},be=async(a,e,t)=>{try{console.log(`[PG CONN] Query: ${a}`);let{rows:r,fields:s,command:o,rowCount:n}=await e.query({text:a,rowMode:"array"});if(o==="UPDATE"||o==="INSERT"||o==="DELETE"){if(n!=null&&n>3&&t.allowBulkUpdate!==!0)throw new Error("[PG CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[n]],query:a}}if(o==="SELECT"){let c=s.map(d=>`'${d.tableID}-${d.columnID}'`),i=await St(c,e);return{columns:s.map(d=>{let l=i[`${d.tableID}-${d.columnID}`];return{column:l?.column||d.name,alias:d.name,table:l?.table||"",full:l?l.table+"."+l.column:d.name}}),rows:r,query:a}}throw new Error(`[PG CONN] Unsupported command: ${o}`)}catch(r){throw r instanceof u?r:new u(400,r.message)}},bt=async(a,e)=>{await a.query("BEGIN");try{let t=await e();return await a.query("COMMIT"),console.log("[PG CONN] Commit"),t}catch(t){throw await a.query("ROLLBACK"),console.log("[PG CONN] Rollback"),t}},Ie=async a=>{let e=await gt(a),t=!1,r=!1,s=async o=>(r||await e.query(`SET search_path TO ${a.dbSchema}`),o());return{dbType:"postgres",dataSource:a,inspectSchema:()=>wt(a,e),executeQuery:(o,n)=>s(()=>n.type==="SELECT"?be(o,e,n):bt(e,()=>be(o,e,n))),checkConnection:async()=>{},isClosed:()=>t,close:async()=>{if(!t)return t=!0,e.end()}}};var M=async(a,e)=>{try{let t;if(a.dbType==="mysql")t=await Se(a);else if(a.dbType==="postgres")t=await Ie(a);else throw new u(500,`Connection manager for ${a.dbType} not found`);return e.__connections?e.__connections.push(t):e.__connections=[t],t}catch(t){throw console.error(t),t instanceof u?t:t?.code==="ECONNREFUSED"?new u(500,"Failed to connect to the database"):new u(500,t.message)}};var Ce=f(a=>{a.get("/:id",async e=>{let{id:t}=g(e),r=await h.findOne({where:{id:t}});if(!r)throw new u(404,"Data source not found");return{data:r}}),a.get("/",async e=>{let{teamId:t}=q(e);return{data:await h.find({where:{team:{id:t}},order:{createdAt:"DESC"}})}}),a.post("/",async(e,t)=>{let{teamId:r,ownerId:s,...o}=y(e,Te),n=h.create({...o,team:{id:r},owner:{id:s}}),c=await M(n,e);try{await c.checkConnection()}catch{throw new u(400,"Cannot connect to the database, please check datasource configuration")}return{data:await h.save(n)}}),a.put("/:id",async(e,t)=>{let{id:r}=g(e),s=y(e),o=await h.findOneBy({id:r});if(!o)throw new u(404,"Data source not found");let n=h.merge(o,s);return await h.save(n),{data:n}}),a.delete("/:id",async(e,t)=>E.transaction(async()=>{let{id:r}=g(e);await Promise.all([A.delete({datasource:{id:r}}),I.delete({dataSource:{id:r}})]),await h.delete({id:r})})),a.post("/:id/inspect",async(e,t)=>{let{id:r}=g(e),s=await h.findOneBy({id:r});if(!s)throw new Error("Data source not found");s.status="INSPECTING",await h.save(s);let n=await(await M(s,e)).inspectSchema();await A.delete({datasource:{id:r}}),await A.insert(n.sort().map(c=>A.create({tableName:c.tableName,columns:c.columns,datasource:{id:r}}))),s.status="READY",s.lastInspected=new Date,await h.save(s)}),a.get("/:id/inspections",async(e,t)=>{let{id:r}=g(e);return{data:await A.find({where:{datasource:{id:r}}})}})});var Ae=f(a=>{a.get("/team/:teamId/files",async(e,t)=>{let{teamId:r}=g(e),s={where:{team:{id:r}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0}},[o=[],n=[],c=[]]=await Promise.all([h.find(s),S.find({...s,where:{...s.where,isTrash:!1}}),I.find({...s,where:{...s.where,isTrash:!1}})]);return{data:[...o.map(i=>({...i,type:"dataSource"})),...n.map(i=>({...i,type:"workbook"})),...c.map(i=>({...i,type:"query"}))]}}),a.get("/team/:teamId/trash",async e=>{let{teamId:t}=g(e);return{data:await E.query(`
58
58
  select id, name, updatedAt
59
59
  from workbooks
60
60
  where teamId = '${t}' AND (isTrash = true OR isTrash IS NULL)
61
61
  order by name asc
62
62
  limit 100;
63
- `)}})});function B(a,e=void 0){try{if(a){let t=a.split("&"),r={};for(let s of t){let o=s.split(":");r[o[0]]=o[1]}return r}}catch{}return e}var Pe=require("typeorm"),_e=f(a=>{a.get("/",async e=>{let{dataSourceId:t,teamId:r,limit:s,orderBy:o,name:n}=q(e);if(!t&&!r)throw new u(400,"Either dsId or teamId is required");let c={isTrash:!1};return t&&(c.dataSource={id:t}),r&&(c.team={id:r}),n&&(c.name=(0,Pe.Like)(`%${n}%`)),{data:await I.find({where:c,take:s,order:B(o,{createdAt:"DESC"})})}}),a.get("/:id",async e=>{let{id:t}=g(e),r=await I.findOne({where:{id:t},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return r?{data:r}:{status:404,data:"Query not found"}}),a.post("/",async e=>{let t=y(e),r=await h.findOne({where:{id:t.dataSourceId},relations:{team:!0}});return{data:await I.save(I.create({name:t.name,isTrash:!1,opts:t.opts,team:{id:r?.team.id},dataSource:{id:t.dataSourceId}}))}}),a.patch("/:id",async e=>{let{id:t}=g(e),r=y(e);if(!(await I.update(t,r)).affected)throw new u(404,"Workbook not found");return{data:await I.findOneBy({id:t})}}),a.delete("/:id",async e=>w.transaction(async()=>{let{id:t}=g(e);if(!(await I.delete({id:t})).affected)return{status:404,data:"Workbook not found"}}))});var xe=_(qe()),Fe=require("typeorm");function Me(a,e,t){return`${a.replace(/;\s*$/,"").trim()} LIMIT ${e} OFFSET ${t}`}function Ue(a,e){return a.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g,(t,r)=>{if(!(r in e))throw new Error(`Missing value for SQL variable: ${r}`);return String(e[r])})}function Le(a){let t=a.replace(/--.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").trim().match(/^\s*(\(?\s*)*([a-zA-Z]+)/);if(!t)throw new u(400,"Failed to detect query type");return t[2].toUpperCase()}function It(a){return a||20}function Ct(a){return a||0}function At(a){return a.includes(" ")&&!a.startsWith("'")?`\`${a}\``:a}var Qe=async(a,{sql:e,variables:t,datasourceId:r,filters:s,joins:o,orderBy:n,size:c,page:i,columns:d,groupBy:l})=>{let T=await h.findOneBy({id:r}),m=[],p=[];if(!T)throw new u(404,"Data source not found");let E=new xe.SQLManipulator(e,T.dbType);if(t&&E.setParameters(t),E.getParsed().type==="SELECT"){E.setLimit(c||20),E.setOffset(c*i),s?.forEach(b=>{E.addWhere(b)}),o&&E.addJoin(...o),n&&E.addOrderBy(...n.map(b=>({...b,column:At(b.column)}))),d&&d.length>0&&E.selectColumns(d),l&&l.length>0&&l.forEach(b=>E.addGroupBy(b));let L=E.getParsed();L.table&&m.push(L.table),L.joins&&L.joins.length>0&&L.joins.forEach(b=>{m.push(b.table)});let Xe=await A.find({where:{tableName:(0,Fe.In)(m),datasource:{id:r}}});for(let b of Xe)if(b.columns)for(let et of b.columns)p.push({column:et.name,table:b.tableName||""})}return{...await(await M(T,a)).executeQuery(E.toExecutableSQL(),{type:E.getParsed().type,allowBulkUpdate:!1}),tables:m,allColumns:p}},$e=async(a,{sql:e,variables:t,datasourceId:r,size:s,page:o})=>{let n=await h.findOneBy({id:r});if(!n)throw new u(404,"Data source not found");let c=Le(e),i=e;if(c==="SELECT"){if(i.match(/LIMIT|OFFSET/ig))throw new u(400,"Queries are automatically paginated, do not use LIMIT and/or OFFSET");let l=It(s);i=Me(i,l,l*Ct(o))}return t&&(i=Ue(i,t)),(await M(n,a)).executeQuery(i,{type:c,allowBulkUpdate:!1})};var Be=f(a=>{a.post("/sql",async e=>{let t=y(e);return{data:await Qe(e,t)}}),a.post("/raw",async e=>{let t=y(e);return{data:await $e(e,t)}})});var ve=require("node:child_process"),We=f(a=>{a.get("/",async(e,t)=>({data:{active:!0,version:process.env.SERVER_VERSION}})),a.get("/logs",async()=>{(0,ve.spawn)(`echo "${process.env.SERVER_VERSION}"`)})});var je=f(a=>{a.get("/",async(e,t)=>{let r=O(e);return{data:await k.find({where:{users:{id:r}}})}}),a.post("/",async(e,t)=>w.transaction(async()=>{let r=O(e),s=y(e),o=R.create();o.id=r;let n=k.create(s);return n.users=[o],await k.save(n),{data:n}}))});var He=async a=>({email:"local@localhost",sub:"local"});async function Ye(){let a=k.create({name:"Personal"}),e=await R.save(R.create({}));return a.users=[e],await k.save(a),await R.update(e.id,{currentTeam:{id:a.id}}),R.findOne({where:{},relations:{currentTeam:!0}})}var Ge=f(a=>{a.post("/register",async(e,t)=>{let r=await He(e);if(!r?.email||!r?.sub)throw new u(400,"Invalid token");return{data:await Ye()}}),a.get("/",async(e,t)=>{let r=await R.findOne({where:{},relations:{currentTeam:!0}});return r?{data:r}:{data:await Ye()}}),a.put("/",async(e,t)=>{let r=O(e),s=y(e);if(!(await R.update(r,s)).affected)throw new u(404,"User not found");return{data:R.findOneBy({id:r})}}),a.put("/team",async(e,t)=>{let r=O(e),s=y(e);return await R.update(r,{currentTeam:{id:s.teamId}}),{data:await R.findOne({where:{id:r},relations:{currentTeam:!0}})}})});var Pt="********************************************",Ve=a=>a.slice(0,4)+Pt+a.slice(a.length-4);function _t(a){let e=P.create(a);return a.openAiToken&&(e.openAiToken=Ve(a.openAiToken)),e}var ze=f(a=>{a.get("/",async e=>{let t=O(e),r=await P.findOneBy({user:{id:t}});return r||(r=await P.save(P.create({user:{id:t},model:"gpt-4o"}))),{data:_t(r)}}),a.patch("/",async e=>{let{settings:t}=y(e);if(!t.id)throw new u(400,"Settings id is required!");if(!(await P.update(t.id,t)).affected)throw new u(404,"You do not own these settings!");return{data:await P.findOneBy({id:t.id})}})});var Je=f(a=>{a.get("/",async e=>{let{dsId:t,teamId:r,limit:s,orderBy:o}=q(e);if(!t&&!r)throw new u(400,"Either dsId or teamId is required");return{data:await S.find({where:{team:{id:r},isTrash:!1},take:s,order:B(o,{createdAt:"DESC"})})}}),a.get("/:id",async e=>{let{id:t}=g(e),r=await S.findOneBy({id:t});return r?{data:r}:{status:404,data:"Workbook not found"}}),a.post("/",async e=>{let t=y(e);return{data:await S.save(S.create({name:t.name,isTrash:!1,team:{id:t.teamId}}))}}),a.patch("/:id",async e=>{let{id:t}=g(e),r=y(e);if(!(await S.update(t,r)).affected)throw new u(404,"Workbook not found");return{data:await S.findOneBy({id:t})}}),a.delete("/:id",async e=>{let{id:t}=g(e);if(!(await S.delete({id:t})).affected)return{status:404,data:"Workbook not found"}}),a.get("/:id/content",async e=>{let{id:t}=g(e),r=await S.findOneBy({id:t});if(!r)throw new u(404,"Workbook not found");try{let s=await fe(r?.path);if(s)return{data:s}}catch{}return{data:""}}),a.patch("/:id/content",async e=>{let{id:t}=g(e),r=y(e),s=await S.findOneBy({id:t});if(!s?.path)throw new u(404,"Workbook not found");await ye(s?.path,r.content),await S.update(s.id,{updatedAt:new Date})})});var U=(0,Ke.default)(),Ot=process.env.PORT?parseInt(process.env.PORT):4466;function C(a,e){U.register(a,{prefix:e}),console.log("Registered "+e)}async function Dt(){await he(),C(ge,"/api/chat"),C(Ce,"/api/data-sources"),C(Ae,"/api/project"),C(_e,"/api/queries"),C(Be,"/api/runner"),C(We,"/api/status"),C(je,"/api/teams"),C(Ge,"/api/users"),C(ze,"/api/user-settings"),C(Je,"/api/workbooks"),U.register(Ze.default,{origin:"*",methods:"*"}),U.addHook("onResponse",async a=>{a.__connections&&a.__connections.forEach(e=>{e.close()})}),U.setErrorHandler((a,e,t)=>{if(a instanceof u){console.error(a),t.status(a.status).send({error:a.message});return}else console.error(a),t.status(500).send({error:"Internal Server Error"})}),await U.after(),await me(),U.listen({port:Ot,host:"0.0.0.0"},(a,e)=>{a&&(console.error(a),process.exit(1)),console.log(`Server listening at ${e}`)})}Dt();
63
+ `)}})});function B(a,e=void 0){try{if(a){let t=a.split("&"),r={};for(let s of t){let o=s.split(":");r[o[0]]=o[1]}return r}}catch{}return e}var Oe=require("typeorm"),Pe=f(a=>{a.get("/",async e=>{let{dataSourceId:t,teamId:r,limit:s,orderBy:o,name:n}=q(e);if(!t&&!r)throw new u(400,"Either dsId or teamId is required");let c={isTrash:!1};return t&&(c.dataSource={id:t}),r&&(c.team={id:r}),n&&(c.name=(0,Oe.Like)(`%${n}%`)),{data:await I.find({where:c,take:s,order:B(o,{createdAt:"DESC"})})}}),a.get("/:id",async e=>{let{id:t}=g(e),r=await I.findOne({where:{id:t},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return r?{data:r}:{status:404,data:"Query not found"}}),a.post("/",async e=>{let t=y(e),r=await h.findOne({where:{id:t.dataSourceId},relations:{team:!0}});return{data:await I.save(I.create({name:t.name,isTrash:!1,opts:t.opts,team:{id:r?.team.id},dataSource:{id:t.dataSourceId}}))}}),a.patch("/:id",async e=>{let{id:t}=g(e),r=y(e);if(!(await I.update(t,r)).affected)throw new u(404,"Workbook not found");return{data:await I.findOneBy({id:t})}}),a.delete("/:id",async e=>E.transaction(async()=>{let{id:t}=g(e);if(!(await I.delete({id:t})).affected)return{status:404,data:"Workbook not found"}}))});var xe=P(qe()),Fe=require("typeorm");function Me(a,e,t){return`${a.replace(/;\s*$/,"").trim()} LIMIT ${e} OFFSET ${t}`}function Ue(a,e){return a.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g,(t,r)=>{if(!(r in e))throw new Error(`Missing value for SQL variable: ${r}`);return String(e[r])})}function Le(a){let t=a.replace(/--.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").trim().match(/^\s*(\(?\s*)*([a-zA-Z]+)/);if(!t)throw new u(400,"Failed to detect query type");return t[2].toUpperCase()}function It(a){return a||20}function Ct(a){return a||0}function At(a){return a.includes(" ")&&!a.startsWith("'")?`\`${a}\``:a}var Qe=async(a,{table:e,variables:t,datasourceId:r,filters:s,joins:o,orderBy:n,size:c,page:i,columns:d,groupBy:l})=>{let T=await h.findOneBy({id:r}),m=[],p=[];if(!T)throw new u(404,"Data source not found");let w=new xe.SQLManipulator(T.dbType,"SELECT");if(w.setTable(e),t&&w.setParameters(t),w.getParsed().type!=="SELECT")throw new u(400,"Only SELECT queries are allowed in this endpoint");w.setLimit(c||20),w.setOffset(c*i),s?.forEach(b=>{w.addWhere(Ot(b))}),o&&w.addJoin(...o),n&&w.addOrderBy(...n.map(b=>({...b,column:At(b.column)}))),d&&d.length>0&&w.selectColumns(d),l&&l.length>0&&l.forEach(b=>w.addGroupBy(b));let L=w.getParsed();L.table&&m.push(L.table),L.joins&&L.joins.length>0&&L.joins.forEach(b=>{m.push(b.table)});let Xe=await A.find({where:{tableName:(0,Fe.In)(m),datasource:{id:r}}});for(let b of Xe)if(b.columns)for(let et of b.columns)p.push({column:et.name,table:b.tableName||""});return{...await(await M(T,a)).executeQuery(w.toExecutableSQL(),{type:w.getParsed().type,allowBulkUpdate:!1}),tables:m,allColumns:p}},$e=async(a,{sql:e,variables:t,datasourceId:r,size:s,page:o})=>{let n=await h.findOneBy({id:r});if(!n)throw new u(404,"Data source not found");let c=Le(e),i=e;if(c==="SELECT"){if(i.match(/LIMIT|OFFSET/ig))throw new u(400,"Queries are automatically paginated, do not use LIMIT and/or OFFSET");let l=It(s);i=Me(i,l,l*Ct(o))}return t&&(i=Ue(i,t)),(await M(n,a)).executeQuery(i,{type:c,allowBulkUpdate:!1})};function Ot(a){let e={...a};switch(e.operator){case"IS NULL":case"IS NOT NULL":e.value=void 0;break;case"LIKE":case"ILIKE":case"NOT LIKE":case"NOT ILIKE":e.value=[`%${e.value}%`];break}return e}var Be=f(a=>{a.post("/sql",async e=>{let t=y(e);return{data:await Qe(e,t)}}),a.post("/raw",async e=>{let t=y(e);return{data:await $e(e,t)}})});var ve=require("node:child_process"),We=f(a=>{a.get("/",async(e,t)=>({data:{active:!0,version:process.env.SERVER_VERSION}})),a.get("/logs",async()=>{(0,ve.spawn)(`echo "${process.env.SERVER_VERSION}"`)})});var je=f(a=>{a.get("/",async(e,t)=>{let r=_(e);return{data:await k.find({where:{users:{id:r}}})}}),a.post("/",async(e,t)=>E.transaction(async()=>{let r=_(e),s=y(e),o=R.create();o.id=r;let n=k.create(s);return n.users=[o],await k.save(n),{data:n}}))});var He=async a=>({email:"local@localhost",sub:"local"});async function Ye(){let a=k.create({name:"Personal"}),e=await R.save(R.create({}));return a.users=[e],await k.save(a),await R.update(e.id,{currentTeam:{id:a.id}}),R.findOne({where:{},relations:{currentTeam:!0}})}var Ge=f(a=>{a.post("/register",async(e,t)=>{let r=await He(e);if(!r?.email||!r?.sub)throw new u(400,"Invalid token");return{data:await Ye()}}),a.get("/",async(e,t)=>{let r=await R.findOne({where:{},relations:{currentTeam:!0}});return r?{data:r}:{data:await Ye()}}),a.put("/",async(e,t)=>{let r=_(e),s=y(e);if(!(await R.update(r,s)).affected)throw new u(404,"User not found");return{data:R.findOneBy({id:r})}}),a.put("/team",async(e,t)=>{let r=_(e),s=y(e);return await R.update(r,{currentTeam:{id:s.teamId}}),{data:await R.findOne({where:{id:r},relations:{currentTeam:!0}})}})});var Pt="********************************************",Ve=a=>a.slice(0,4)+Pt+a.slice(a.length-4);function _t(a){let e=O.create(a);return a.openAiToken&&(e.openAiToken=Ve(a.openAiToken)),e}var ze=f(a=>{a.get("/",async e=>{let t=_(e),r=await O.findOneBy({user:{id:t}});return r||(r=await O.save(O.create({user:{id:t},model:"gpt-4o"}))),{data:_t(r)}}),a.patch("/",async e=>{let{settings:t}=y(e);if(!t.id)throw new u(400,"Settings id is required!");if(!(await O.update(t.id,t)).affected)throw new u(404,"You do not own these settings!");return{data:await O.findOneBy({id:t.id})}})});var Ke=f(a=>{a.get("/",async e=>{let{dsId:t,teamId:r,limit:s,orderBy:o}=q(e);if(!t&&!r)throw new u(400,"Either dsId or teamId is required");return{data:await S.find({where:{team:{id:r},isTrash:!1},take:s,order:B(o,{createdAt:"DESC"})})}}),a.get("/:id",async e=>{let{id:t}=g(e),r=await S.findOneBy({id:t});return r?{data:r}:{status:404,data:"Workbook not found"}}),a.post("/",async e=>{let t=y(e);return{data:await S.save(S.create({name:t.name,isTrash:!1,team:{id:t.teamId}}))}}),a.patch("/:id",async e=>{let{id:t}=g(e),r=y(e);if(!(await S.update(t,r)).affected)throw new u(404,"Workbook not found");return{data:await S.findOneBy({id:t})}}),a.delete("/:id",async e=>{let{id:t}=g(e);if(!(await S.delete({id:t})).affected)return{status:404,data:"Workbook not found"}}),a.get("/:id/content",async e=>{let{id:t}=g(e),r=await S.findOneBy({id:t});if(!r)throw new u(404,"Workbook not found");try{let s=await fe(r?.path);if(s)return{data:s}}catch{}return{data:""}}),a.patch("/:id/content",async e=>{let{id:t}=g(e),r=y(e),s=await S.findOneBy({id:t});if(!s?.path)throw new u(404,"Workbook not found");await ye(s?.path,r.content),await S.update(s.id,{updatedAt:new Date})})});var U=(0,Je.default)(),Dt=process.env.PORT?parseInt(process.env.PORT):4466;function C(a,e){U.register(a,{prefix:e}),console.log("Registered "+e)}async function Nt(){await he(),C(ge,"/api/chat"),C(Ce,"/api/data-sources"),C(Ae,"/api/project"),C(Pe,"/api/queries"),C(Be,"/api/runner"),C(We,"/api/status"),C(je,"/api/teams"),C(Ge,"/api/users"),C(ze,"/api/user-settings"),C(Ke,"/api/workbooks"),U.register(Ze.default,{origin:"*",methods:"*"}),U.addHook("onResponse",async a=>{a.__connections&&a.__connections.forEach(e=>{e.close()})}),U.setErrorHandler((a,e,t)=>{if(a instanceof u){console.error(a),t.status(a.status).send({error:a.message});return}else console.error(a),t.status(500).send({error:"Internal Server Error"})}),await U.after(),await me(),U.listen({port:Dt,host:"0.0.0.0"},(a,e)=>{a&&(console.error(a),process.exit(1)),console.log(`Server listening at ${e}`)})}Nt();
package/dist/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@dataramen/local-server","version":"0.0.31","license":"MIT","main":"code/proxy.js","dependencies":{"@fastify/cors":"^11.0.1","dotenv":"^16.5.0","fast-glob":"^3.3.3","fastify":"^5.3.2","mysql2":"^3.14.1","pg":"^8.15.6","sqlite3":"^5.1.7","typeorm":"^0.3.23"},"devDependencies":{"yargs":"^18.0.0","fs-extra":"^11.3.0"}}
1
+ {"name":"@dataramen/local-server","version":"0.0.32","license":"MIT","main":"code/proxy.js","dependencies":{"@fastify/cors":"^11.0.1","dotenv":"^16.5.0","fast-glob":"^3.3.3","fastify":"^5.3.2","mysql2":"^3.14.1","pg":"^8.15.6","sqlite3":"^5.1.7","typeorm":"^0.3.23"},"devDependencies":{"yargs":"^18.0.0","fs-extra":"^11.3.0"}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dataramen/cli",
3
- "version": "0.0.5",
3
+ "version": "0.0.6",
4
4
  "license": "MIT",
5
5
  "bin": {
6
6
  "dataramen-cli": "bin/run.js"