@dataramen/cli 0.0.27 → 0.0.29
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/code/proxy.js +11 -11
- package/dist/code/web/assets/index-DUr1OfwS.css +1 -0
- package/dist/code/web/assets/index-Dp6xlP0_.js +310 -0
- package/dist/code/web/index.html +2 -2
- package/dist/package.json +1 -1
- package/package.json +1 -1
- package/dist/code/web/assets/index-D0T4eZNm.js +0 -310
- package/dist/code/web/assets/index-DqfnnDma.css +0 -1
package/dist/code/proxy.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
"use strict";var rt=Object.create;var ae=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ot=Object.getOwnPropertyNames;var nt=Object.getPrototypeOf,st=Object.prototype.hasOwnProperty;var q=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var it=(t,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of ot(e))!st.call(t,o)&&o!==r&&ae(t,o,{get:()=>e[o],enumerable:!(a=at(e,o))||a.enumerable});return t};var _=(t,e,r)=>(r=t!=null?rt(nt(t)):{},it(e||!t||!t.__esModule?ae(r,"default",{value:t,enumerable:!0}):r,t));var Me=q(Ue=>{"use strict";Object.defineProperty(Ue,"__esModule",{value:!0})});var Z=q(N=>{"use strict";Object.defineProperty(N,"__esModule",{value:!0});N.buildWhereCondition=N.buildSelect=N.isString=void 0;var bt=t=>typeof t=="string";N.isString=bt;var Rt=t=>{let e="SELECT ";if(t.columns&&t.columns.length>0?e+=t.columns.join(", "):e+="*",t.table&&(e+=` FROM ${t.table}`),t.joins&&t.joins.length>0&&t.joins.forEach(r=>{e+=` ${r.type} JOIN ${r.table} ON ${r.on}`}),t.where&&(e+=` WHERE ${t.where}`),t.groupBy&&t.groupBy.length>0&&(e+=` GROUP BY ${t.groupBy.join(", ")}`),t.having&&(e+=` HAVING ${t.having}`),t.orderBy&&t.orderBy.length>0){let r=t.orderBy.reduce((o,n)=>(o[n.column]=n.direction,o),{}),a=Object.entries(r).map(([o,n])=>`${o} ${n}`);e+=` ORDER BY ${a.join(", ")}`}return t.limit!==void 0&&(e+=` LIMIT ${t.limit}`),t.offset!==void 0&&(e+=` OFFSET ${t.offset}`),e};N.buildSelect=Rt;var Nt=t=>{let{column:e,operator:r,value:a}=t;switch(r){case"IS NULL":case"IS NOT NULL":return`${e} ${r}`;case"IN":case"NOT IN":let o=a?.map(i=>(0,N.isString)(i.value)?`'${i.value}'`:i.value).join(", ");return`${e} ${r} (${o})`;default:let n=a?.[0],s;return(0,N.isString)(n?.value)&&n?.isColumn!==!0?s=`'${n?.value}'`:s=n?.value,`${e} ${r} ${s}`}};N.buildWhereCondition=Nt});var ve=q(B=>{"use strict";Object.defineProperty(B,"__esModule",{value:!0});B.SelectQueryBuilder=void 0;var Le=Z(),X=class{constructor(e="mysql"){this.dialect=e,this.skeleton={type:"SELECT"}}addWhere(e){let r=(0,Le.buildWhereCondition)(e);if(this.skeleton.where){let a=e.connector||"AND";this.skeleton.where+=` ${a} ${r}`}else this.skeleton.where=r;return this}addWhereRaw(e,r="AND"){return this.skeleton.where?this.skeleton.where+=` ${r} ${e}`:this.skeleton.where=e,this}clearWhere(){return this.skeleton.where=void 0,this}addOrderBy(...e){return this.skeleton.orderBy||(this.skeleton.orderBy=[]),this.skeleton.orderBy.push(...e),this}clearOrderBy(){return this.skeleton.orderBy=void 0,this}setLimit(e){return this.skeleton.limit=e,this}setOffset(e){return this.skeleton.offset=e,this}addGroupBy(e){this.skeleton.groupBy||(this.skeleton.groupBy=[]);let r=this.skeleton.groupBy.findIndex(a=>a===e);return r>-1?this.skeleton.groupBy[r]=e:this.skeleton.groupBy.push(e),this}setHaving(e){return this.skeleton.having=e,this}setTable(e){return this.skeleton.table=e,this}addJoin(...e){return this.skeleton.joins||(this.skeleton.joins=[]),this.skeleton.joins.push(...e),this}selectColumns(e){if(this.skeleton.type!=="SELECT")throw new Error("Column selection is only supported for SELECT queries");return this.skeleton.columns=e,this}toSQL(){return(0,Le.buildSelect)(this.skeleton)}};B.SelectQueryBuilder=X});var xe=q(C=>{"use strict";var _t=C&&C.__createBinding||(Object.create?function(t,e,r,a){a===void 0&&(a=r);var o=Object.getOwnPropertyDescriptor(e,r);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,a,o)}:function(t,e,r,a){a===void 0&&(a=r),t[a]=e[r]}),ee=C&&C.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&_t(e,t,r)};Object.defineProperty(C,"__esModule",{value:!0});ee(Me(),C);ee(ve(),C);ee(Z(),C)});var Q=require("dotenv"),$=require("node:path"),oe=require("node:fs"),ut=(()=>{try{let t=(0,oe.readFileSync)((0,$.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(t)}catch{return{version:"0.0.0"}}})();(0,Q.config)({path:[(0,$.join)(__dirname,"..","env",".env"),(0,$.join)(__dirname,"..","env",".env.default")]});(0,Q.populate)(process.env,{SERVER_VERSION:ut.version});var ze=_(require("fastify")),Ve=_(require("@fastify/cors")),Je=_(require("@fastify/static"));var u=class extends Error{constructor(r,a){super(a);this.status=r;this.message=a}};var de=require("typeorm");var ne=require("typeorm"),W=new ne.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 se=require("typeorm"),j=new se.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 ie=require("typeorm"),Y=new ie.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 ue=require("typeorm"),H=new ue.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 ce=require("typeorm"),G=new ce.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 le=require("typeorm"),K=new le.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 pe=_(require("os"));var me=require("typeorm"),z=new me.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 t=process.env.TYPEORM_DATABASE;if(!t)throw new Error("Bad value for TYPEORM_DATABASE. Please check your config!");return t.startsWith("<home>")&&(t=t.replace("<home>",pe.default.homedir())),t}var T=new de.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:[W,K,j,Y,H,G,z]}),fe=async()=>{if(!T.isInitialized)return T.initialize();throw new Error("Already initialized")},R=T.getRepository(W),m=T.getRepository(K),U=T.getRepository(j),w=T.getRepository(Y),M=T.getRepository(H),ye=T.getRepository(G),E=T.getRepository(z);var V=_(require("node:fs/promises")),Te=require("node:path"),ge=_(require("node:os")),lt=ge.default.homedir(),Se=(0,Te.join)(lt,".dataramen",".runtime","files"),he=async()=>{await mt()||await V.default.mkdir(Se,{recursive:!0})};async function mt(){try{return(await V.default.lstat(Se)).isDirectory()}catch{return!1}}var g=t=>(e,r,a)=>{t(e),a()};var y=(t,e)=>{let r=t.body;return e&&e(r),r},v=(t,e)=>{let r=t.query;return e&&e(r),r},S=(t,e)=>{let r=t.params;return e&&e(r),r},D=t=>t.headers["phoenix-user-id"];var Ee=t=>{if(!t.dbUrl)throw new u(400,"url is required");if(!t.dbUser)throw new u(400,"user is required");if(!t.dbType)throw new u(400,"type is required");if(!t.name)throw new u(400,"name is required");if(!t.dbDatabase)throw new u(400,"database is required")};var we=_(require("mysql2/promise"));var dt=({dbDatabase:t,dbPassword:e,dbUser:r,dbUrl:a})=>we.default.createConnection({host:a,user:r,database:t,password:e}),pt=async t=>{let e=`
|
|
1
|
+
"use strict";var gt=Object.create;var fe=Object.defineProperty;var St=Object.getOwnPropertyDescriptor;var Et=Object.getOwnPropertyNames;var It=Object.getPrototypeOf,Rt=Object.prototype.hasOwnProperty;var L=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ht=(e,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Et(t))!Rt.call(e,o)&&o!==r&&fe(e,o,{get:()=>t[o],enumerable:!(a=St(t,o))||a.enumerable});return e};var N=(e,t,r)=>(r=e!=null?gt(It(e)):{},ht(t||!e||!e.__esModule?fe(r,"default",{value:e,enumerable:!0}):r,e));var je=L(Ye=>{"use strict";Object.defineProperty(Ye,"__esModule",{value:!0})});var oe=L(Y=>{"use strict";Object.defineProperty(Y,"__esModule",{value:!0});Y.PostgreSqlFunctions=void 0;var G=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`};Y.PostgreSqlFunctions={YEAR:e=>`EXTRACT(YEAR FROM ${e.value})`,MONTH:e=>`EXTRACT(MONTH FROM ${e.value})`,DAY:e=>`EXTRACT(DAY FROM ${e.value})`,SUM:e=>`COALESCE(SUM(${e.distinct===!0?"distinct ":""}${e.value}), 0)`,AVG:G,MAX:G,MIN:G,COUNT:G}});var ne=L(W=>{"use strict";Object.defineProperty(W,"__esModule",{value:!0});W.MySqlColumnFunctions=void 0;var j=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`};W.MySqlColumnFunctions={YEAR:e=>`YEAR(${e.value})`,MONTH:e=>`MONTH(${e.value})`,DAY:e=>`DAY(${e.value})`,SUM:e=>{let t=e.distinct===!0?"distinct ":"";return`coalesce(${e.fn}(${t}${e.value}), 0)`},AVG:j,MAX:j,MIN:j,COUNT:j}});var se=L(m=>{"use strict";Object.defineProperty(m,"__esModule",{value:!0});m.transformColumn=m.isAggregationFunction=m.isAllowedFunction=m.ALLOWED_AGGREGATION_FUNCTIONS=m.ALLOWED_COLUMN_FUNCTIONS=m.COLUMN_FUNCTIONS=m.AGGREGATION_FUNCTIONS=void 0;var Qt=oe(),$t=ne();m.AGGREGATION_FUNCTIONS=["SUM","COUNT","AVG","MAX","MIN"];m.COLUMN_FUNCTIONS=["YEAR","MONTH","DAY",...m.AGGREGATION_FUNCTIONS];m.ALLOWED_COLUMN_FUNCTIONS=m.COLUMN_FUNCTIONS.reduce((e,t)=>(e[t]=!0,e),{});m.ALLOWED_AGGREGATION_FUNCTIONS=m.AGGREGATION_FUNCTIONS.reduce((e,t)=>(e[t]=!0,e),{});var Bt=e=>m.ALLOWED_COLUMN_FUNCTIONS[e];m.isAllowedFunction=Bt;var Gt=e=>m.ALLOWED_AGGREGATION_FUNCTIONS[e];m.isAggregationFunction=Gt;var Yt=(e,t)=>e.fn&&(0,m.isAllowedFunction)(e.fn)?(t==="postgres"?Qt.PostgreSqlFunctions:$t.MySqlColumnFunctions)[e.fn](e):e.value;m.transformColumn=Yt});var ie=L(A=>{"use strict";Object.defineProperty(A,"__esModule",{value:!0});A.buildQueryFilterCondition=A.buildSelect=A.isString=void 0;var jt=se(),Wt=e=>typeof e=="string";A.isString=Wt;var Ht=e=>{let t="SELECT ";if(e.columns&&e.columns.length>0?t+=e.columns.join(", "):t+="*",e.table&&(t+=` FROM ${e.table}`),e.joins&&e.joins.length>0&&e.joins.forEach(r=>{t+=` ${r.type} JOIN ${r.table} ON ${r.on}`}),e.where&&(t+=` WHERE ${e.where}`),e.groupBy&&e.groupBy.length>0&&(t+=` GROUP BY ${e.groupBy.join(", ")}`),e.having&&(t+=` HAVING ${e.having}`),e.orderBy&&e.orderBy.length>0){let r=e.orderBy.reduce((o,n)=>(o[n.column]=n.direction,o),{}),a=Object.entries(r).map(([o,n])=>`${o} ${n}`);t+=` ORDER BY ${a.join(", ")}`}return e.limit!==void 0&&(t+=` LIMIT ${e.limit}`),e.offset!==void 0&&(t+=` OFFSET ${e.offset}`),t};A.buildSelect=Ht;var Kt=(e,t)=>{let{column:r,operator:a,value:o,fn:n}=e,s=(0,jt.transformColumn)({value:r,fn:n},t);switch(a){case"IS NULL":case"IS NOT NULL":return`${s} ${a}`;case"IN":case"NOT IN":let u=o?.map(S=>(0,A.isString)(S.value)?`'${S.value}'`:S.value).join(", ");return`${s} ${a} (${u})`;case"LIKE":case"ILIKE":case"NOT LIKE":case"NOT ILIKE":return`${s} ${a} %${o?.[0]}%`;default:let c=o?.[0],l;return(0,A.isString)(c?.value)&&c?.isColumn!==!0?l=`'${c?.value}'`:l=c?.value,`${s} ${a} ${l}`}};A.buildQueryFilterCondition=Kt});var We=L(H=>{"use strict";Object.defineProperty(H,"__esModule",{value:!0});H.SelectQueryBuilder=void 0;var ue=ie(),ce=class{constructor(t="mysql"){this.dialect=t,this.skeleton={type:"SELECT"}}addWhere(t){let r=(0,ue.buildQueryFilterCondition)(t,this.dialect);if(this.skeleton.where){let a=t.connector||"AND";this.skeleton.where+=` ${a} ${r}`}else this.skeleton.where=r;return this}addWhereRaw(t,r="AND"){return this.skeleton.where?this.skeleton.where+=` ${r} ${t}`:this.skeleton.where=t,this}clearWhere(){return this.skeleton.where=void 0,this}addHaving(t){let r=(0,ue.buildQueryFilterCondition)(t,this.dialect);if(this.skeleton.having){let a=t.connector||"AND";this.skeleton.having+=` ${a} ${r}`}else this.skeleton.having=r;return this}clearHaving(){return this.skeleton.having=void 0,this}addOrderBy(...t){return this.skeleton.orderBy||(this.skeleton.orderBy=[]),this.skeleton.orderBy.push(...t),this}clearOrderBy(){return this.skeleton.orderBy=void 0,this}setLimit(t){return this.skeleton.limit=t,this}setOffset(t){return this.skeleton.offset=t,this}addGroupBy(t){this.skeleton.groupBy||(this.skeleton.groupBy=[]);let r=this.skeleton.groupBy.findIndex(a=>a===t);return r>-1?this.skeleton.groupBy[r]=t:this.skeleton.groupBy.push(t),this}setTable(t){return this.skeleton.table=t,this}addJoin(...t){return this.skeleton.joins||(this.skeleton.joins=[]),this.skeleton.joins.push(...t),this}selectColumns(t){if(this.skeleton.type!=="SELECT")throw new Error("Column selection is only supported for SELECT queries");return this.skeleton.columns=t,this}toSQL(){return(0,ue.buildSelect)(this.skeleton)}};H.SelectQueryBuilder=ce});var le=L(_=>{"use strict";var Vt=_&&_.__createBinding||(Object.create?function(e,t,r,a){a===void 0&&(a=r);var o=Object.getOwnPropertyDescriptor(t,r);(!o||("get"in o?!t.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,o)}:function(e,t,r,a){a===void 0&&(a=r),e[a]=t[r]}),K=_&&_.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&Vt(t,e,r)};Object.defineProperty(_,"__esModule",{value:!0});K(je(),_);K(We(),_);K(ie(),_);K(se(),_)});var B=require("dotenv"),$=require("node:path"),Te=require("node:fs"),wt=(()=>{try{let e=(0,Te.readFileSync)((0,$.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})();(0,B.config)({path:[(0,$.join)(__dirname,"..","env",".env"),(0,$.join)(__dirname,"..","env",".env.default")]});(0,B.populate)(process.env,{SERVER_VERSION:wt.version});var lt=N(require("fastify")),dt=N(require("@fastify/cors")),mt=N(require("@fastify/static"));var i=class extends Error{constructor(r,a){super(a);this.status=r;this.message=a}};var Ne=require("typeorm");var ge=require("typeorm"),V=new ge.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 Se=require("typeorm"),z=new Se.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 Ee=require("typeorm"),J=new Ee.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 Ie=require("typeorm"),X=new Ie.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 Re=require("typeorm"),Z=new Re.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 he=require("typeorm"),ee=new he.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 be=N(require("os"));var we=require("typeorm"),te=new we.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 Nt(){let e=process.env.TYPEORM_DATABASE;if(!e)throw new Error("Bad value for TYPEORM_DATABASE. Please check your config!");return e.startsWith("<home>")&&(e=e.replace("<home>",be.default.homedir())),e}var g=new Ne.DataSource({type:process.env.TYPEORM_CONNECTION,database:Nt(),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:[V,ee,z,J,X,Z,te]}),Oe=async()=>{if(!g.isInitialized)return g.initialize();throw new Error("Already initialized")},O=g.getRepository(V),p=g.getRepository(ee),v=g.getRepository(z),b=g.getRepository(J),x=g.getRepository(X),Ae=g.getRepository(Z),h=g.getRepository(te);var re=N(require("node:fs/promises")),_e=require("node:path"),Ce=N(require("node:os")),bt=Ce.default.homedir(),De=(0,_e.join)(bt,".dataramen",".runtime","files"),Pe=async()=>{await Ot()||await re.default.mkdir(De,{recursive:!0})};async function Ot(){try{return(await re.default.lstat(De)).isDirectory()}catch{return!1}}var E=e=>(t,r,a)=>{e(t),a()};var T=(e,t)=>{let r=e.body;return t&&t(r),r},F=(e,t)=>{let r=e.query;return t&&t(r),r},R=(e,t)=>{let r=e.params;return t&&t(r),r},M=e=>e.headers["phoenix-user-id"];var Me=e=>{if(!e.dbUrl)throw new i(400,"url is required");if(!e.dbUser)throw new i(400,"user is required");if(!e.dbType)throw new i(400,"type is required");if(!e.name)throw new i(400,"name is required");if(!e.dbDatabase)throw new i(400,"database is required")};var Le=N(require("mysql2/promise"));var At=({dbDatabase:e,dbPassword:t,dbUser:r,dbUrl:a})=>Le.default.createConnection({host:a,user:r,database:e,password:t}),_t=async e=>{let t=`
|
|
2
2
|
SELECT TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION
|
|
3
3
|
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
|
|
4
4
|
WHERE CONSTRAINT_NAME = 'PRIMARY'
|
|
5
5
|
ORDER BY TABLE_NAME, ORDINAL_POSITION;
|
|
6
|
-
`,[r]=await
|
|
6
|
+
`,[r]=await e.execute(t),a={};return r.forEach(o=>{let n=o.TABLE_NAME,s=o.COLUMN_NAME;a[n]||(a[n]=[]),a[n].push(s)}),a},Ct=async e=>{let t=`
|
|
7
7
|
SELECT
|
|
8
8
|
TABLE_NAME AS table_name,
|
|
9
9
|
COLUMN_NAME AS field,
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
WHERE
|
|
15
15
|
REFERENCED_TABLE_NAME IS NOT NULL
|
|
16
16
|
AND CONSTRAINT_SCHEMA = DATABASE();
|
|
17
|
-
`,[r]=await
|
|
17
|
+
`,[r]=await e.execute(t),a={};return Array.isArray(r)&&r.forEach(o=>{a[o.table_name]||(a[o.table_name]={}),a[o.table_name][o.field]={refTable:o.referenced_table,refField:o.referenced_field}}),a},Dt=async(e,t)=>{let a=(await t.query("SHOW TABLES"))[0],o=await Ct(t),n=await _t(t),s=a.map(async u=>{let c=Object.values(u)[0],l=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${e.dbDatabase}' and table_name = '${c}'`,[S]=await t.query(l),w=o[c];return{columns:S.map(y=>({name:y.COLUMN_NAME,type:y.DATA_TYPE,isPrimary:n[c]?.includes(y.COLUMN_NAME),ref:w?.[y.COLUMN_NAME]?{table:w[y.COLUMN_NAME].refTable,field:w[y.COLUMN_NAME].refField}:void 0})).sort((y,f)=>y.isPrimary&&f.isPrimary?y.name.localeCompare(f.name):y.isPrimary?-1:1),createdAt:new Date,tableName:c,updatedAt:new Date}});return Promise.all(s)},Ue=async(e,t,r)=>{try{console.log(`[MYSQL CONN] Query: ${e}`);let[a,o]=await t.query({sql:e,rowsAsArray:!0}),n=a?.constructor?.name;if(n==="ResultSetHeader"){let s=a;if(s.affectedRows>1&&r.allowBulkUpdate!==!0)throw new Error("[MYSQL CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[s.affectedRows]],query:e}}else if(n==="Array"){let s=a;return{columns:o?.map(u=>({column:u.orgName||u.name,table:u.orgTable,alias:u.name,full:u.orgTable?u.orgTable+"."+u.orgName:u.name}))||[],rows:s,query:e}}throw new Error(`[MYSQL CONN] Unknown result type: ${n}`)}catch(a){throw console.error(a),a instanceof i?a:new i(400,a.message)}},Pt=async(e,t)=>{await e.beginTransaction();try{let r=await t();return await e.commit(),console.log("[MYSQL CONN] Commit"),r}catch(r){throw await e.rollback(),console.warn(r.message),console.log("[MYSQL CONN] Rollback"),r}},Mt=async(e,t)=>{await e.query("START TRANSACTION READ ONLY");try{let r=await t();return console.log("[MYSQL CONN] Read only rollback"),await e.query("ROLLBACK"),r}catch(r){throw console.warn(r.message),await e.query("ROLLBACK"),r}},ve=async e=>{let t=await At(e),r=!1;return{dbType:"mysql",dataSource:e,inspectSchema:()=>Dt(e,t),executeQuery:(a,o)=>o.type==="SELECT"?Mt(t,()=>Ue(a,t,o)):Pt(t,()=>Ue(a,t,o)),checkConnection:async()=>t.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.destroy()}}};var qe=N(require("pg"));var Ut=async({dbDatabase:e,dbPassword:t,dbUser:r,dbUrl:a,dbPort:o})=>{let n=new qe.default.Client({host:a,user:r,database:e,password:t,port:o,query_timeout:1e4});return await n.connect(),n},Lt=async e=>{let r=await e.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
|
-
`),a={};return r.rows.forEach(o=>{let n=o.table_name,s=o.column_name;a[n]||(a[n]=[]),a[n].push(s)}),a},
|
|
31
|
+
`),a={};return r.rows.forEach(o=>{let n=o.table_name,s=o.column_name;a[n]||(a[n]=[]),a[n].push(s)}),a},vt=async e=>{let r=await e.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
|
-
`),a={};return r.rows.forEach(o=>{a[o.table_name]||(a[o.table_name]={}),a[o.table_name][o.field]={refTable:o.referenced_table,refField:o.referenced_field}}),a},
|
|
46
|
+
`),a={};return r.rows.forEach(o=>{a[o.table_name]||(a[o.table_name]={}),a[o.table_name][o.field]={refTable:o.referenced_table,refField:o.referenced_field}}),a},xt=async(e,t)=>{let r=`SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = '${e.dbSchema}'`,o=(await t.query(r)).rows,n=await vt(t),s=await Lt(t),u=o.map(async c=>{let l=Object.values(c)[0],S=`
|
|
47
47
|
SELECT column_name, data_type
|
|
48
48
|
FROM information_schema.columns
|
|
49
49
|
WHERE
|
|
50
|
-
table_name = '${
|
|
51
|
-
table_schema = '${
|
|
52
|
-
`,{rows:
|
|
50
|
+
table_name = '${l}' and
|
|
51
|
+
table_schema = '${e.dbSchema}'
|
|
52
|
+
`,{rows:w}=await t.query(S),y=n[l];return{columns:w.map(f=>({name:f.column_name,type:f.data_type,isPrimary:s[l]?.includes(f.column_name),ref:y?.[f.column_name]?{table:y[f.column_name].refTable,field:y[f.column_name].refField}:void 0})).sort((f,I)=>f.isPrimary&&I.isPrimary?f.name.localeCompare(I.name):f.isPrimary?-1:1),createdAt:new Date,tableName:l,updatedAt:new Date}});return Promise.all(u)},qt=async(e,t)=>{let r=`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
|
-
concat(pg_class.oid, '-', attnum) IN (${
|
|
57
|
-
limit 25;`;return(await
|
|
56
|
+
concat(pg_class.oid, '-', attnum) IN (${e.join(", ")})
|
|
57
|
+
limit 25;`;return(await t.query(r)).rows.reduce((o,n)=>(o[n.row_key]={table:n.relname,column:n.attname},o),{})},xe=async(e,t,r)=>{try{console.log(`[PG CONN] Query: ${e}`);let{rows:a,fields:o,command:n,rowCount:s}=await t.query({text:e,rowMode:"array"});if(n==="UPDATE"||n==="INSERT"||n==="DELETE"){if(s!=null&&s>1&&r.allowBulkUpdate!==!0)throw new Error("[PG CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[s]],query:e}}if(n==="SELECT"){let u=o.map(l=>`'${l.tableID}-${l.columnID}'`),c=await qt(u,t);return{columns:o.map(l=>{let S=c[`${l.tableID}-${l.columnID}`];return{column:S?.column||l.name,alias:l.name,table:S?.table||"",full:S?S.table+"."+S.column:l.name}}),rows:a,query:e}}throw new Error(`[PG CONN] Unsupported command: ${n}`)}catch(a){throw a instanceof i?a:new i(400,a.message)}},Ft=async(e,t)=>{await e.query("BEGIN");try{let r=await t();return await e.query("COMMIT"),console.log("[PG CONN] Commit"),r}catch(r){throw await e.query("ROLLBACK"),console.log("[PG CONN] Rollback"),r}},kt=async(e,t)=>{await e.query("BEGIN READ ONLY");try{let r=await t();return console.log("[PG CONN] Read only rollback"),await e.query("ROLLBACK"),r}catch(r){throw console.log("[PG CONN] Rollback"),await e.query("ROLLBACK"),r}},Fe=async e=>{let t=await Ut(e),r=!1,a=!1,o=async n=>(a||await t.query(`SET search_path TO ${e.dbSchema}`),n());return{dbType:"postgres",dataSource:e,inspectSchema:()=>xt(e,t),executeQuery:(n,s)=>o(()=>s.type==="SELECT"?kt(t,()=>xe(n,t,s)):Ft(t,()=>xe(n,t,s))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.end()}}};var q=async(e,t)=>{try{let r;if(e.dbType==="mysql")r=await ve(e);else if(e.dbType==="postgres")r=await Fe(e);else throw new i(500,`Connection manager for ${e.dbType} not found`);return t.__connections?t.__connections.push(r):t.__connections=[r],r}catch(r){throw console.error(r),r instanceof i?r:r?.code==="ECONNREFUSED"?new i(500,"Failed to connect to the database"):new i(500,r.message)}};var ke=E(e=>{e.get("/:id",async t=>{let{id:r}=R(t),a=await p.findOne({where:{id:r}});if(!a)throw new i(404,"Data source not found");return{data:a}}),e.get("/",async t=>{let{teamId:r}=F(t);return{data:await p.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}),e.post("/",async(t,r)=>{let{teamId:a,ownerId:o,...n}=T(t,Me),s=p.create({...n,team:{id:a},owner:{id:o}}),u=await q(s,t);try{await u.checkConnection()}catch{throw new i(400,"Cannot connect to the database, please check datasource configuration")}return{data:await p.save(s)}}),e.put("/:id",async(t,r)=>{let{id:a}=R(t),o=T(t),n=await p.findOneBy({id:a});if(!n)throw new i(404,"Data source not found");let s=p.merge(n,o);return await p.save(s),{data:s}}),e.delete("/:id",async(t,r)=>g.transaction(async()=>{let{id:a}=R(t);await Promise.all([O.delete({datasource:{id:a}}),h.delete({dataSource:{id:a}})]),await p.delete({id:a})})),e.post("/:id/inspect",async(t,r)=>{let{id:a}=R(t),o=await p.findOneBy({id:a});if(!o)throw new Error("Data source not found");o.status="INSPECTING",await p.save(o);let s=await(await q(o,t)).inspectSchema();await O.delete({datasource:{id:a}}),await O.insert(s.sort().map(u=>O.create({tableName:u.tableName,columns:u.columns,datasource:{id:a}}))),o.status="READY",o.lastInspected=new Date,await p.save(o)}),e.get("/:id/inspections",async(t,r)=>{let{id:a}=R(t);return{data:await O.find({where:{datasource:{id:a}}})}})});var ae=require("typeorm"),Qe=E(e=>{e.get("/team/:teamId/files",async(t,r)=>{let{teamId:a}=R(t),o={where:{team:{id:a}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0}},[n=[],s=[],u=[]]=await Promise.all([p.find(o),Ae.find({...o,where:{...o.where,isTrash:!1}}),h.find({...o,where:{...o.where,isTrash:!1}})]);return{data:[...n.map(c=>({...c,type:"dataSource"})),...s.map(c=>({...c,type:"workbook"})),...u.map(c=>({...c,type:"query"}))]}}),e.get("/team/:teamId/trash",async t=>{let{teamId:r}=R(t);return{data:await g.query(`
|
|
58
58
|
select id, name, updatedAt
|
|
59
59
|
from workbooks
|
|
60
60
|
where teamId = '${r}' AND (isTrash = true OR isTrash IS NULL)
|
|
61
61
|
order by name asc
|
|
62
62
|
limit 100;
|
|
63
|
-
`)}}),
|
|
63
|
+
`)}}),e.get("/team/:teamId/query",async t=>{let{teamId:r}=R(t),{search:a,size:o}=F(t),n=(parseInt(o)||20)/2,[s,u]=await Promise.all([O.find({where:{tableName:(0,ae.Like)(`%${a}%`),datasource:{team:{id:r}}},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:n}),h.find({where:{name:(0,ae.Like)(`%${a}%`),isTrash:!1,dataSource:{team:{id:r}}},relations:{dataSource:!0},select:{id:!0,name:!0,dataSource:{name:!0,id:!0}},order:{name:"ASC"},take:n})]),c=[];return s.forEach(l=>{c.push({name:l.tableName,id:l.id,dataSourceName:l.datasource?.name||"--",dataSourceId:l.datasource?.id||"--",type:"table"})}),u.forEach(l=>{c.push({name:l.name,id:l.id,dataSourceName:l.dataSource?.name||"--",dataSourceId:l.dataSource?.id||"--",type:"query"})}),{data:c}})});function $e(e,t=void 0){try{if(e){let r=e.split("&"),a={};for(let o of r){let n=o.split(":");a[n[0]]=n[1]}return a}}catch{}return t}var Be=require("typeorm"),Ge=E(e=>{e.get("/",async t=>{let{dataSourceId:r,teamId:a,limit:o,orderBy:n,name:s}=F(t);if(!r&&!a)throw new i(400,"Either dsId or teamId is required");let u={isTrash:!1};return r&&(u.dataSource={id:r}),a&&(u.team={id:a}),s&&(u.name=(0,Be.Like)(`%${s}%`)),{data:await h.find({where:u,take:o,order:$e(n,{createdAt:"DESC"})})}}),e.get("/:id",async t=>{let{id:r}=R(t),a=await h.findOne({where:{id:r},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return a?{data:a}:{status:404,data:"Query not found"}}),e.post("/",async t=>{let r=T(t),a=await p.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await h.save(h.create({name:r.name,isTrash:!1,opts:r.opts,team:{id:a?.team.id},dataSource:{id:r.dataSourceId}}))}}),e.patch("/:id",async t=>{let{id:r}=R(t),a=T(t);if(!(await h.update(r,a)).affected)throw new i(404,"Workbook not found");return{data:await h.findOneBy({id:r})}}),e.delete("/:id",async t=>g.transaction(async()=>{let{id:r}=R(t);if(!(await h.delete({id:r})).affected)return{status:404,data:"Workbook not found"}}))});var C=N(le()),ze=require("typeorm");var He=[{value:"=",label:"equals"},{value:"<>",label:"not equal"},{value:">",label:"greater than"},{value:">=",label:"greater than or equal"},{value:"<",label:"less than"},{value:"<=",label:"less than or equal"},{value:"LIKE",label:"contains"},{value:"NOT LIKE",label:"not contains"},{value:"ILIKE",label:"case-insensitive contains"},{value:"NOT ILIKE",label:"case-insensitive not contains"},{value:"IN",label:"in list"},{value:"NOT IN",label:"not in list"},{value:"IS NULL",label:"is null"},{value:"IS NOT NULL",label:"is not null"}],zt=He.reduce((e,t)=>(e[t.value]=t.label,e),{}),ya=He.reduce((e,t)=>(e[t.label]=t.value,e),{}),k=e=>e.map(t=>({label:zt[t],value:t})),fa=k(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),Ta=k(["=","<>","LIKE","NOT LIKE","ILIKE","NOT ILIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),ga=k(["=","<>","IS NULL","IS NOT NULL"]),Sa=k(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),Ea=k(["IS NULL","IS NOT NULL"]),Ia=k(["IN","NOT IN"]);var Ke=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"];var Ra=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var Ve=e=>e.fn?e.distinct===!0?`${e.fn} distinct ${e.value}`:`${e.fn} ${e.value}`:e.value;var de=N(oe()),me=N(ne()),pe=async(e,{table:t,datasourceId:r,filters:a,joins:o,orderBy:n,size:s,page:u,columns:c,groupBy:l,searchAll:S})=>{let w=await p.findOneBy({id:r}),y=[t],f=[];if(!w)throw new i(404,"Data source not found");let I=new C.SelectQueryBuilder(w.dbType);I.setTable(t),I.setLimit(s||20),I.setOffset(s*u),a?.forEach(d=>{d.fn&&(0,C.isAggregationFunction)(d.fn)?I.addHaving(d):I.addWhere(d)}),o&&(I.addJoin(...o),o.forEach(d=>{y.push(d.table)})),n&&I.addOrderBy(...n.map(d=>({...d,column:er(d.column,w.dbType)}))),l&&l.length>0&&l.forEach(d=>I.addGroupBy(Zt(d,w.dbType)));let ft=await O.find({where:{tableName:(0,ze.In)(y),datasource:{id:r}}});for(let d of ft)if(d.columns)for(let P of d.columns)f.push({column:P.name,table:d.tableName||"",full:`${d.tableName}.${P.name}`,type:P.type});let Q;if(c&&c.length>0?Q=c.map(d=>Xt(d,w.dbType)):Q=f.map(d=>`${d.full} as "${d.full}"`),I.selectColumns(Q),S){let d=f.filter(P=>Ke.includes(P.type)&&Q.includes(P.full));if(d.length>0){let P=d.map(Tt=>`LOWER(${Tt.full}) LIKE '%${S.toLowerCase()}%'`);I.addWhereRaw(`(${P.join(" OR ")})`,"AND")}}return{...await(await q(w,e)).executeQuery(I.toSQL(),{type:"SELECT",allowBulkUpdate:!1}),tables:y,allColumns:f}},Je=async(e,t)=>{let r=await p.findOneBy({id:t.datasourceId});if(!r)throw new i(404,"Data source not found");let a=t.values.map(({value:u,column:c})=>typeof u=="string"?u&&u.startsWith("=")?`${c}=${u.substring(1)}`:`${c}='${u}'`:`${c}='${u}'`).join(", "),o=t.filters.map(u=>(0,C.buildQueryFilterCondition)(u,r.dbType)).join(" AND "),n=`UPDATE ${t.table} SET ${a} WHERE ${o}`;return(await q(r,e)).executeQuery(n,{type:"UPDATE",allowBulkUpdate:!1})},Xe=async(e,t)=>{let r=await p.findOneBy({id:t.datasourceId});if(!r)throw new i(404,"Data source not found");let{keys:a,values:o}=Jt(t.values),n=`INSERT INTO ${t.table} (${a}) VALUES (${o})`;return(await q(r,e)).executeQuery(n,{type:"INSERT",allowBulkUpdate:!1})},Jt=e=>{let t=e.map(({column:a})=>a).join(", "),r=e.map(({value:a})=>typeof a=="string"?a&&a.startsWith("=")?a.substring(1):`'${a}'`:a).join(", ");return{keys:t,values:r}},Xt=(e,t)=>{if(e.fn){if((0,C.isAllowedFunction)(e.fn))return`${(t==="postgres"?de.PostgreSqlFunctions:me.MySqlColumnFunctions)[e.fn](e)} as "${Ve(e)}"`;throw new Error("Function not allowed: "+e.fn)}return`${e.value} as "${e.value}"`},Zt=(e,t)=>{if(e.fn){if((0,C.isAllowedFunction)(e.fn))return(t==="postgres"?de.PostgreSqlFunctions:me.MySqlColumnFunctions)[e.fn](e);throw new Error("Function not allowed: "+e.fn)}return e.value},er=(e,t)=>t==="postgres"?`"${e}"`:t==="mysql"?`\`${e}\``:e;var Ze=N(le()),ye=e=>{if(!e.table)throw new i(400,"Table is required")},tr=["--",";","DROP","drop"],et=e=>{if((0,Ze.isString)(e.value)&&e.value.startsWith("=")){let t=e.value;tr.forEach(r=>{if(t.includes(r))throw new i(400,"Invalid input value for "+e.column)})}},tt=e=>{if(!e.table)throw new i(400,"Table is required");e.values.forEach(et)},rt=e=>{if(!e.table)throw new i(400,"Table is required");e.values.forEach(et)};var at=E(e=>{e.post("/sql",async t=>{let r=T(t,ye);return{data:await pe(t,r)}}),e.post("/select",async t=>{let r=T(t,ye);return{data:await pe(t,r)}}),e.post("/insert",async t=>{let r=T(t,tt);return{data:await Xe(t,r)}}),e.post("/update",async t=>{let r=T(t,rt);return{data:await Je(t,r)}})});var ot=require("node:child_process"),nt=E(e=>{e.get("/",async(t,r)=>({data:{active:!0,version:process.env.SERVER_VERSION}})),e.get("/logs",async()=>{(0,ot.spawn)(`echo "${process.env.SERVER_VERSION}"`)})});var st=E(e=>{e.get("/",async(t,r)=>{let a=M(t);return{data:await v.find({where:{users:{id:a}}})}}),e.post("/",async(t,r)=>g.transaction(async()=>{let a=M(t),o=T(t),n=b.create();n.id=a;let s=v.create(o);return s.users=[n],await v.save(s),{data:s}}))});async function rr(){let e=v.create({name:"Personal"}),t=await b.save(b.create({}));return e.users=[t],await v.save(e),await b.update(t.id,{currentTeam:{id:e.id}}),b.findOne({where:{},relations:{currentTeam:!0}})}var it=E(e=>{e.get("/",async(t,r)=>{let a=await b.findOne({where:{},relations:{currentTeam:!0}});return a?{data:a}:{data:await rr()}}),e.put("/",async(t,r)=>{let a=M(t),o=T(t);if(!(await b.update(a,o)).affected)throw new i(404,"User not found");return{data:b.findOneBy({id:a})}}),e.put("/team",async(t,r)=>{let a=M(t),o=T(t);return await b.update(a,{currentTeam:{id:o.teamId}}),{data:await b.findOne({where:{id:a},relations:{currentTeam:!0}})}})});var ar="********************************************",ut=e=>e.slice(0,4)+ar+e.slice(e.length-4);function or(e){let t=x.create(e);return e.openAiToken&&(t.openAiToken=ut(e.openAiToken)),t}var ct=E(e=>{e.get("/",async t=>{let r=M(t),a=await x.findOneBy({user:{id:r}});return a||(a=await x.save(x.create({user:{id:r},model:"gpt-4o"}))),{data:or(a)}}),e.patch("/",async t=>{let{settings:r}=T(t);if(!r.id)throw new i(400,"Settings id is required!");if(!(await x.update(r.id,r)).affected)throw new i(404,"You do not own these settings!");return{data:await x.findOneBy({id:r.id})}})});var pt=require("node:path"),D=(0,lt.default)(),yt=process.env.PORT?parseInt(process.env.PORT):4466,nr=process.env.HOST==="true"?"0.0.0.0":"127.0.0.1",sr=(process.env.ALLOWED_ORIGINS||"").split(",").map(e=>e.trim()),ir=["https://app.dataramen.xyz","https://dataramen.xyz",`http://localhost:${yt}`,...sr];function U(e,t){D.register(e,{prefix:t}),console.log("Registered "+t)}(async function(){await Pe(),U(ke,"/api/data-sources"),U(Qe,"/api/project"),U(Ge,"/api/queries"),U(at,"/api/runner"),U(nt,"/api/status"),U(st,"/api/teams"),U(it,"/api/users"),U(ct,"/api/user-settings"),D.register(mt.default,{root:(0,pt.join)(__dirname,"web")}),D.get("/",(t,r)=>{r.sendFile("index.html")}),D.register(dt.default,{origin:(t,r)=>{!t||ir.includes(t)?r(null,!0):r(new Error("Not allowed by CORS"),!1)},methods:"*"}),D.addHook("onResponse",async t=>{t.__connections&&t.__connections.forEach(r=>{r.close()})}),D.setNotFoundHandler((t,r)=>{if(t.raw.url?.startsWith("/api/")){r.code(404).send({error:"API route not found"});return}r.sendFile("index.html")}),D.setErrorHandler((t,r,a)=>{if(t instanceof i){console.error(t),a.status(t.status).send({error:t.message});return}else console.error(t),a.status(500).send({error:"Internal Server Error"})}),await D.after(),await Oe(),D.listen({port:yt,host:nr},(t,r)=>{t&&(console.error(t),process.exit(1)),console.log(`Server listening at ${r}`)})})();
|