@dataramen/cli 0.0.25 → 0.0.26
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/bin/run.js +2 -2
- package/dist/code/cli.js +2 -2
- package/dist/code/proxy.js +2 -2
- package/dist/code/web/assets/index-D1q3n6vT.js +310 -0
- package/dist/code/web/index.html +1 -1
- package/dist/package.json +1 -1
- package/package.json +1 -1
package/bin/run.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`);for(let s of
|
|
2
|
+
var B=Object.create;var P=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var G=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var Q=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of q(e))!z.call(t,s)&&s!==n&&P(t,s,{get:()=>e[s],enumerable:!(r=U(e,s))||r.enumerable});return t};var l=(t,e,n)=>(n=t!=null?B(G(t)):{},Q(e||!t||!t.__esModule?P(n,"default",{value:t,enumerable:!0}):n,t));var D=l(require("yargs")),J=require("yargs/helpers");var x=require("node:os"),b=require("node:path"),X=(0,x.homedir)();var a="@dataramen/local-server",o=(0,b.join)(X,".dataramen",".runtime","server");var H=require("node:path"),L=l(require("fs-extra")),W=require("node:child_process");var R=l(require("fs-extra")),h=require("node:path");function _(t){let e;function n(){try{return e||(e=R.readJsonSync(t)),e}catch{return}}return n}var A=_((0,h.join)(__dirname,"..","package.json")),v=_((0,h.join)(o,"package.json"));var f=l(require("fs-extra")),c=require("node:path"),k=require("node:child_process"),C=require("node:util"),d=l(require("yocto-spinner")),p=(0,C.promisify)(k.exec);function T(){try{let t=v();if(!t)return!0;let e=f.readJsonSync((0,c.join)(__dirname,"..","dist","package.json"));return t.version!==e.version}catch{return!0}}async function V(){let t=(0,d.default)({text:"Checking if PM2 is installed"}).start();try{return await p("pm2 -v"),t.success("PM2 already installed"),!0}catch{return t.warning("PM2 not installed"),!1}}async function N(){let t=(0,d.default)({text:"Installing PM2"}).start();try{await p("npm i -g pm2"),t.success("Installed PM2")}catch{t.error("Failed to install PM2"),process.exit(1)}}async function y(){let t=(0,d.default)({text:"Stop running instances of "+a}).start();try{await p(`pm2 stop "${a}"`),t.warning("Stopped "+a)}catch{t.success("No running instances of "+a+" found")}}async function j(){let t=(0,d.default)({text:"Create local server"}).start();f.copySync((0,c.join)(__dirname,"..","dist","code"),(0,c.join)(o,"code")),f.copySync((0,c.join)(__dirname,"..","dist","env",".env.default"),(0,c.join)(o,"env",".env.default")),f.copySync((0,c.join)(__dirname,"..","dist","package.json"),(0,c.join)(o,"package.json")),t.text="Install local server dependencies",await p("npm i",{cwd:o}),t.success("Local server installed")}var w=l(require("yocto-spinner")),S=l(require("open"));var O=require("node:net");async function I(t){return new Promise(e=>{let n=(0,O.createServer)().once("error",()=>{e(!1)}).once("listening",()=>{n.close()}).once("close",()=>e(!0)).listen(t,"127.0.0.1")})}var M=require("fs-extra");var $=require("node:path");function Y(...t){let e={};for(let n of t){let r=n.split(`
|
|
3
|
+
`);for(let s of r){let i=s.trim();if(!i||i.startsWith("#"))continue;let g=i.indexOf("=");if(g===-1)continue;let K=i.slice(0,g).trim(),m=i.slice(g+1).trim();(m.startsWith('"')&&m.endsWith('"')||m.startsWith("'")&&m.endsWith("'"))&&(m=m.slice(1,-1)),e[K]=m}}return{getNumber:n=>et(e[n]),getString:n=>nt(e[n]),getBoolean:n=>rt(e[n])}}function Z(t){let e=[];for(let n of t){let r=tt(n);r&&e.push(r)}return Y(...e)}var E=Z([".env.default",".env"]);function tt(t){try{return(0,M.readFileSync)((0,$.join)(o,"env",t),"utf-8")}catch{return}}function et(t){if(!t)return;let e=Number(t);if(!isNaN(e)&&t.trim()!=="")return e;throw new Error("Wrong env value type")}function nt(t){if(t){if(typeof t=="string")return t;throw new Error("Wrong env value type")}}function rt(t){if(!t)return;let e=t.toLowerCase();if(e==="true")return!0;if(e==="false")return!1;throw new Error("Wrong env value type")}var ot=async t=>{try{return(await fetch(t,{method:"GET",signal:AbortSignal.timeout(5e3)})).status===200}catch{return!1}},F=async(t,e,n)=>{let r=Date.now();for(;Date.now()-r<e;){if(await ot(t))return!0;await new Promise(i=>setTimeout(i,n))}return!1};async function at(){await V()||await N(),await y();try{T()&&await j();let e=E.getNumber("PORT");if(!e)throw new Error("PORT env variable not found");if(!await I(e))throw new Error(`Port ${e} is occupied by another process`);let r=(0,w.default)({text:"Starting new instance of "+a}).start(),s=L.readJsonSync((0,H.join)(o,"package.json"));await p(`pm2 start "${s.main}" --name "${a}" --no-autorestart`,{cwd:o}),r.success("Local server will be available in a couple of seconds");let i=(0,w.default)({text:"Waiting for the server to become available"}).start();await F(`http://localhost:${e}/api/status`,3e4,1e3)?(await(0,S.default)(`http://localhost:${e}`),i.success(`App is running at http://localhost:${e}`)):i.error("Server failed to become available in time")}catch(e){console.error("Failed to start local server",e)}}async function ct(){(0,W.execSync)(`pm2 logs ${a}`,{stdio:"inherit"})}async function mt(){await y()}function lt(){console.log(`DataRamen CLI version: ${A().version}`),console.log(`DataRamen local server version: ${v().version}`)}async function ft(){let t=E.getNumber("PORT");await(0,S.default)(`http://localhost:${t}`)}var u={start:at,logs:ct,stop:mt,version:lt,open:ft};(0,D.default)((0,J.hideBin)(process.argv)).command("start","Default command, start/restart the server",u.start).command(["logs"],"Listen for logs",u.logs).command("stop","Stop the server",u.stop).command("open","Stop the server",u.open).command(["version"],"Show version",u.version).parse();
|
package/dist/code/cli.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`);for(let s of
|
|
2
|
+
var B=Object.create;var P=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var G=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var Q=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of q(e))!z.call(t,s)&&s!==n&&P(t,s,{get:()=>e[s],enumerable:!(r=U(e,s))||r.enumerable});return t};var l=(t,e,n)=>(n=t!=null?B(G(t)):{},Q(e||!t||!t.__esModule?P(n,"default",{value:t,enumerable:!0}):n,t));var D=l(require("yargs")),J=require("yargs/helpers");var x=require("node:os"),b=require("node:path"),X=(0,x.homedir)();var a="@dataramen/local-server",o=(0,b.join)(X,".dataramen",".runtime","server");var H=require("node:path"),L=l(require("fs-extra")),W=require("node:child_process");var R=l(require("fs-extra")),h=require("node:path");function _(t){let e;function n(){try{return e||(e=R.readJsonSync(t)),e}catch{return}}return n}var A=_((0,h.join)(__dirname,"..","package.json")),v=_((0,h.join)(o,"package.json"));var f=l(require("fs-extra")),c=require("node:path"),k=require("node:child_process"),C=require("node:util"),d=l(require("yocto-spinner")),p=(0,C.promisify)(k.exec);function T(){try{let t=v();if(!t)return!0;let e=f.readJsonSync((0,c.join)(__dirname,"..","dist","package.json"));return t.version!==e.version}catch{return!0}}async function V(){let t=(0,d.default)({text:"Checking if PM2 is installed"}).start();try{return await p("pm2 -v"),t.success("PM2 already installed"),!0}catch{return t.warning("PM2 not installed"),!1}}async function N(){let t=(0,d.default)({text:"Installing PM2"}).start();try{await p("npm i -g pm2"),t.success("Installed PM2")}catch{t.error("Failed to install PM2"),process.exit(1)}}async function y(){let t=(0,d.default)({text:"Stop running instances of "+a}).start();try{await p(`pm2 stop "${a}"`),t.warning("Stopped "+a)}catch{t.success("No running instances of "+a+" found")}}async function j(){let t=(0,d.default)({text:"Create local server"}).start();f.copySync((0,c.join)(__dirname,"..","dist","code"),(0,c.join)(o,"code")),f.copySync((0,c.join)(__dirname,"..","dist","env",".env.default"),(0,c.join)(o,"env",".env.default")),f.copySync((0,c.join)(__dirname,"..","dist","package.json"),(0,c.join)(o,"package.json")),t.text="Install local server dependencies",await p("npm i",{cwd:o}),t.success("Local server installed")}var w=l(require("yocto-spinner")),S=l(require("open"));var O=require("node:net");async function I(t){return new Promise(e=>{let n=(0,O.createServer)().once("error",()=>{e(!1)}).once("listening",()=>{n.close()}).once("close",()=>e(!0)).listen(t,"127.0.0.1")})}var M=require("fs-extra");var $=require("node:path");function Y(...t){let e={};for(let n of t){let r=n.split(`
|
|
3
|
+
`);for(let s of r){let i=s.trim();if(!i||i.startsWith("#"))continue;let g=i.indexOf("=");if(g===-1)continue;let K=i.slice(0,g).trim(),m=i.slice(g+1).trim();(m.startsWith('"')&&m.endsWith('"')||m.startsWith("'")&&m.endsWith("'"))&&(m=m.slice(1,-1)),e[K]=m}}return{getNumber:n=>et(e[n]),getString:n=>nt(e[n]),getBoolean:n=>rt(e[n])}}function Z(t){let e=[];for(let n of t){let r=tt(n);r&&e.push(r)}return Y(...e)}var E=Z([".env.default",".env"]);function tt(t){try{return(0,M.readFileSync)((0,$.join)(o,"env",t),"utf-8")}catch{return}}function et(t){if(!t)return;let e=Number(t);if(!isNaN(e)&&t.trim()!=="")return e;throw new Error("Wrong env value type")}function nt(t){if(t){if(typeof t=="string")return t;throw new Error("Wrong env value type")}}function rt(t){if(!t)return;let e=t.toLowerCase();if(e==="true")return!0;if(e==="false")return!1;throw new Error("Wrong env value type")}var ot=async t=>{try{return(await fetch(t,{method:"GET",signal:AbortSignal.timeout(5e3)})).status===200}catch{return!1}},F=async(t,e,n)=>{let r=Date.now();for(;Date.now()-r<e;){if(await ot(t))return!0;await new Promise(i=>setTimeout(i,n))}return!1};async function at(){await V()||await N(),await y();try{T()&&await j();let e=E.getNumber("PORT");if(!e)throw new Error("PORT env variable not found");if(!await I(e))throw new Error(`Port ${e} is occupied by another process`);let r=(0,w.default)({text:"Starting new instance of "+a}).start(),s=L.readJsonSync((0,H.join)(o,"package.json"));await p(`pm2 start "${s.main}" --name "${a}" --no-autorestart`,{cwd:o}),r.success("Local server will be available in a couple of seconds");let i=(0,w.default)({text:"Waiting for the server to become available"}).start();await F(`http://localhost:${e}/api/status`,3e4,1e3)?(await(0,S.default)(`http://localhost:${e}`),i.success(`App is running at http://localhost:${e}`)):i.error("Server failed to become available in time")}catch(e){console.error("Failed to start local server",e)}}async function ct(){(0,W.execSync)(`pm2 logs ${a}`,{stdio:"inherit"})}async function mt(){await y()}function lt(){console.log(`DataRamen CLI version: ${A().version}`),console.log(`DataRamen local server version: ${v().version}`)}async function ft(){let t=E.getNumber("PORT");await(0,S.default)(`http://localhost:${t}`)}var u={start:at,logs:ct,stop:mt,version:lt,open:ft};(0,D.default)((0,J.hideBin)(process.argv)).command("start","Default command, start/restart the server",u.start).command(["logs"],"Listen for logs",u.logs).command("stop","Stop the server",u.stop).command("open","Stop the server",u.open).command(["version"],"Show version",u.version).parse();
|
package/dist/code/proxy.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
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},A=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 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=`
|
|
2
2
|
SELECT TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION
|
|
3
3
|
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
|
|
4
4
|
WHERE CONSTRAINT_NAME = 'PRIMARY'
|
|
@@ -60,4 +60,4 @@
|
|
|
60
60
|
where teamId = '${r}' AND (isTrash = true OR isTrash IS NULL)
|
|
61
61
|
order by name asc
|
|
62
62
|
limit 100;
|
|
63
|
-
`)}}),t.get("/team/:teamId/query",async e=>{let{teamId:r}=S(e),{search:a,size:o}=v(e),n=(parseInt(o)||20)/2,[s,i]=await Promise.all([R.find({where:{tableName:(0,J.Like)(`%${a}%`),datasource:{team:{id:r}}},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:n}),E.find({where:{name:(0,J.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})]),l=[];return s.forEach(c=>{l.push({name:c.tableName,id:c.id,dataSourceName:c.datasource?.name||"--",dataSourceId:c.datasource?.id||"--",type:"table"})}),i.forEach(c=>{l.push({name:c.name,id:c.id,dataSourceName:c.dataSource?.name||"--",dataSourceId:c.dataSource?.id||"--",type:"query"})}),{data:l}})});function Ae(t,e=void 0){try{if(t){let r=t.split("&"),a={};for(let o of r){let n=o.split(":");a[n[0]]=n[1]}return a}}catch{}return e}var De=require("typeorm"),Pe=g(t=>{t.get("/",async e=>{let{dataSourceId:r,teamId:a,limit:o,orderBy:n,name:s}=v(e);if(!r&&!a)throw new u(400,"Either dsId or teamId is required");let i={isTrash:!1};return r&&(i.dataSource={id:r}),a&&(i.team={id:a}),s&&(i.name=(0,De.Like)(`%${s}%`)),{data:await E.find({where:i,take:o,order:Ae(n,{createdAt:"DESC"})})}}),t.get("/:id",async e=>{let{id:r}=S(e),a=await E.findOne({where:{id:r},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return a?{data:a}:{status:404,data:"Query not found"}}),t.post("/",async e=>{let r=y(e),a=await m.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await E.save(E.create({name:r.name,isTrash:!1,opts:r.opts,team:{id:a?.team.id},dataSource:{id:r.dataSourceId}}))}}),t.patch("/:id",async e=>{let{id:r}=S(e),a=y(e);if(!(await E.update(r,a)).affected)throw new u(404,"Workbook not found");return{data:await E.findOneBy({id:r})}}),t.delete("/:id",async e=>T.transaction(async()=>{let{id:r}=S(e);if(!(await E.delete({id:r})).affected)return{status:404,data:"Workbook not found"}}))});var F=_(xe()),$e=require("typeorm");var ke=[{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"}],Ct=ke.reduce((t,e)=>(t[e.value]=e.label,t),{}),Qr=ke.reduce((t,e)=>(t[e.label]=e.value,t),{}),x=t=>t.map(e=>({label:Ct[e],value:e})),Br=x(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),Fr=x(["=","<>","LIKE","NOT LIKE","ILIKE","NOT ILIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),Wr=x(["=","<>","IS NULL","IS NOT NULL"]),jr=x(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),Yr=x(["IS NULL","IS NOT NULL"]),Hr=x(["IN","NOT IN"]);var qe=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"];var te=t=>t.distinct===!0?`${t.fn} distinct ${t.value}`:`${t.fn} ${t.value}`;var re=async(t,{table:e,datasourceId:r,filters:a,joins:o,orderBy:n,size:s,page:i,columns:l,groupBy:c,searchAll:I})=>{let b=await m.findOneBy({id:r}),p=[e],f=[];if(!b)throw new u(404,"Data source not found");let h=new F.SelectQueryBuilder(b.dbType);h.setTable(e),h.setLimit(s||20),h.setOffset(s*i),a?.forEach(d=>{h.addWhere(At(d))}),o&&(h.addJoin(...o),o.forEach(d=>{p.push(d.table)})),n&&h.addOrderBy(...n.map(d=>({...d,column:Pt(d.column,b.dbType)}))),c&&c.length>0&&c.forEach(d=>h.addGroupBy(d.value));let et=await R.find({where:{tableName:(0,$e.In)(p),datasource:{id:r}}});for(let d of et)if(d.columns)for(let
|
|
63
|
+
`)}}),t.get("/team/:teamId/query",async e=>{let{teamId:r}=S(e),{search:a,size:o}=v(e),n=(parseInt(o)||20)/2,[s,i]=await Promise.all([R.find({where:{tableName:(0,J.Like)(`%${a}%`),datasource:{team:{id:r}}},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:n}),E.find({where:{name:(0,J.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})]),l=[];return s.forEach(c=>{l.push({name:c.tableName,id:c.id,dataSourceName:c.datasource?.name||"--",dataSourceId:c.datasource?.id||"--",type:"table"})}),i.forEach(c=>{l.push({name:c.name,id:c.id,dataSourceName:c.dataSource?.name||"--",dataSourceId:c.dataSource?.id||"--",type:"query"})}),{data:l}})});function Ae(t,e=void 0){try{if(t){let r=t.split("&"),a={};for(let o of r){let n=o.split(":");a[n[0]]=n[1]}return a}}catch{}return e}var De=require("typeorm"),Pe=g(t=>{t.get("/",async e=>{let{dataSourceId:r,teamId:a,limit:o,orderBy:n,name:s}=v(e);if(!r&&!a)throw new u(400,"Either dsId or teamId is required");let i={isTrash:!1};return r&&(i.dataSource={id:r}),a&&(i.team={id:a}),s&&(i.name=(0,De.Like)(`%${s}%`)),{data:await E.find({where:i,take:o,order:Ae(n,{createdAt:"DESC"})})}}),t.get("/:id",async e=>{let{id:r}=S(e),a=await E.findOne({where:{id:r},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return a?{data:a}:{status:404,data:"Query not found"}}),t.post("/",async e=>{let r=y(e),a=await m.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await E.save(E.create({name:r.name,isTrash:!1,opts:r.opts,team:{id:a?.team.id},dataSource:{id:r.dataSourceId}}))}}),t.patch("/:id",async e=>{let{id:r}=S(e),a=y(e);if(!(await E.update(r,a)).affected)throw new u(404,"Workbook not found");return{data:await E.findOneBy({id:r})}}),t.delete("/:id",async e=>T.transaction(async()=>{let{id:r}=S(e);if(!(await E.delete({id:r})).affected)return{status:404,data:"Workbook not found"}}))});var F=_(xe()),$e=require("typeorm");var ke=[{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"}],Ct=ke.reduce((t,e)=>(t[e.value]=e.label,t),{}),Qr=ke.reduce((t,e)=>(t[e.label]=e.value,t),{}),x=t=>t.map(e=>({label:Ct[e],value:e})),Br=x(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),Fr=x(["=","<>","LIKE","NOT LIKE","ILIKE","NOT ILIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),Wr=x(["=","<>","IS NULL","IS NOT NULL"]),jr=x(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),Yr=x(["IS NULL","IS NOT NULL"]),Hr=x(["IN","NOT IN"]);var qe=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"];var te=t=>t.distinct===!0?`${t.fn} distinct ${t.value}`:`${t.fn} ${t.value}`;var re=async(t,{table:e,datasourceId:r,filters:a,joins:o,orderBy:n,size:s,page:i,columns:l,groupBy:c,searchAll:I})=>{let b=await m.findOneBy({id:r}),p=[e],f=[];if(!b)throw new u(404,"Data source not found");let h=new F.SelectQueryBuilder(b.dbType);h.setTable(e),h.setLimit(s||20),h.setOffset(s*i),a?.forEach(d=>{h.addWhere(At(d))}),o&&(h.addJoin(...o),o.forEach(d=>{p.push(d.table)})),n&&h.addOrderBy(...n.map(d=>({...d,column:Pt(d.column,b.dbType)}))),c&&c.length>0&&c.forEach(d=>h.addGroupBy(d.value));let et=await R.find({where:{tableName:(0,$e.In)(p),datasource:{id:r}}});for(let d of et)if(d.columns)for(let A of d.columns)f.push({column:A.name,table:d.tableName||"",full:`${d.tableName}.${A.name}`,type:A.type});let k;if(l&&l.length>0?k=l.map(Dt):k=f.map(d=>`${d.full} as "${d.full}"`),h.selectColumns(k),I){let d=f.filter(A=>qe.includes(A.type)&&k.includes(A.full));if(d.length>0){let A=d.map(tt=>`LOWER(${tt.full}) LIKE '%${I.toLowerCase()}%'`);h.addWhereRaw(`(${A.join(" OR ")})`,"AND")}}return{...await(await L(b,t)).executeQuery(h.toSQL(),{type:"SELECT",allowBulkUpdate:!1}),tables:p,allColumns:f}},Qe=async(t,e)=>{let r=await m.findOneBy({id:e.datasourceId});if(!r)throw new u(404,"Data source not found");let a=e.values.map(({value:i,column:l})=>typeof i=="string"?i&&i.startsWith("=")?`${l}=${i.substring(1)}`:`${l}='${i}'`:`${l}='${i}'`).join(", "),o=e.filters.map(F.buildWhereCondition).join(" AND "),n=`UPDATE ${e.table} SET ${a} WHERE ${o}`;return(await L(r,t)).executeQuery(n,{type:"UPDATE",allowBulkUpdate:!1})},Be=async(t,e)=>{let r=await m.findOneBy({id:e.datasourceId});if(!r)throw new u(404,"Data source not found");let{keys:a,values:o}=Ot(e.values),n=`INSERT INTO ${e.table} (${a}) VALUES (${o})`;return(await L(r,t)).executeQuery(n,{type:"INSERT",allowBulkUpdate:!1})},Ot=t=>{let e=t.map(({column:a})=>a).join(", "),r=t.map(({value:a})=>typeof a=="string"?a&&a.startsWith("=")?a.substring(1):`'${a}'`:a).join(", ");return{keys:e,values:r}},At=t=>{let e={...t};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?.map(r=>({isColumn:r?.isColumn,value:`%${r?.value}%`}));break}return e},Dt=t=>{if(t.fn){let e=t.distinct===!0?"distinct ":"";return t.fn==="sum"?`coalesce(${t.fn}(${e}${t.value}), 0) as "${te(t)}"`:`${t.fn}(${e}${t.value}) as "${te(t)}"`}return`${t.value} as "${t.value}"`},Pt=(t,e)=>e==="postgres"?`"${t}"`:e==="mysql"?`\`${t}\``:t;var Fe=g(t=>{t.post("/sql",async e=>{let r=y(e);return{data:await re(e,r)}}),t.post("/select",async e=>{let r=y(e);return{data:await re(e,r)}}),t.post("/insert",async e=>{let r=y(e);return{data:await Be(e,r)}}),t.post("/update",async e=>{let r=y(e);return{data:await Qe(e,r)}})});var We=require("node:child_process"),je=g(t=>{t.get("/",async(e,r)=>({data:{active:!0,version:process.env.SERVER_VERSION}})),t.get("/logs",async()=>{(0,We.spawn)(`echo "${process.env.SERVER_VERSION}"`)})});var Ye=g(t=>{t.get("/",async(e,r)=>{let a=D(e);return{data:await U.find({where:{users:{id:a}}})}}),t.post("/",async(e,r)=>T.transaction(async()=>{let a=D(e),o=y(e),n=w.create();n.id=a;let s=U.create(o);return s.users=[n],await U.save(s),{data:s}}))});async function Ut(){let t=U.create({name:"Personal"}),e=await w.save(w.create({}));return t.users=[e],await U.save(t),await w.update(e.id,{currentTeam:{id:t.id}}),w.findOne({where:{},relations:{currentTeam:!0}})}var He=g(t=>{t.get("/",async(e,r)=>{let a=await w.findOne({where:{},relations:{currentTeam:!0}});return a?{data:a}:{data:await Ut()}}),t.put("/",async(e,r)=>{let a=D(e),o=y(e);if(!(await w.update(a,o)).affected)throw new u(404,"User not found");return{data:w.findOneBy({id:a})}}),t.put("/team",async(e,r)=>{let a=D(e),o=y(e);return await w.update(a,{currentTeam:{id:o.teamId}}),{data:await w.findOne({where:{id:a},relations:{currentTeam:!0}})}})});var Mt="********************************************",Ge=t=>t.slice(0,4)+Mt+t.slice(t.length-4);function Lt(t){let e=M.create(t);return t.openAiToken&&(e.openAiToken=Ge(t.openAiToken)),e}var Ke=g(t=>{t.get("/",async e=>{let r=D(e),a=await M.findOneBy({user:{id:r}});return a||(a=await M.save(M.create({user:{id:r},model:"gpt-4o"}))),{data:Lt(a)}}),t.patch("/",async e=>{let{settings:r}=y(e);if(!r.id)throw new u(400,"Settings id is required!");if(!(await M.update(r.id,r)).affected)throw new u(404,"You do not own these settings!");return{data:await M.findOneBy({id:r.id})}})});var Ze=require("node:path"),O=(0,ze.default)(),Xe=process.env.PORT?parseInt(process.env.PORT):4466,vt=["https://app.dataramen.xyz","https://dataramen.xyz","http://localhost:3000",`http://localhost:${Xe}`];function P(t,e){O.register(t,{prefix:e}),console.log("Registered "+e)}async function xt(){await he(),P(Ce,"/api/data-sources"),P(Oe,"/api/project"),P(Pe,"/api/queries"),P(Fe,"/api/runner"),P(je,"/api/status"),P(Ye,"/api/teams"),P(He,"/api/users"),P(Ke,"/api/user-settings"),O.register(Je.default,{root:(0,Ze.join)(__dirname,"web")}),O.get("/",(t,e)=>{e.sendFile("index.html")}),O.register(Ve.default,{origin:(t,e)=>{!t||vt.includes(t)?e(null,!0):e(new Error("Not allowed by CORS"),!1)},methods:"*"}),O.addHook("onResponse",async t=>{t.__connections&&t.__connections.forEach(e=>{e.close()})}),O.setNotFoundHandler((t,e)=>{if(t.raw.url?.startsWith("/api/")){e.code(404).send({error:"API route not found"});return}e.sendFile("index.html")}),O.setErrorHandler((t,e,r)=>{if(t instanceof u){console.error(t),r.status(t.status).send({error:t.message});return}else console.error(t),r.status(500).send({error:"Internal Server Error"})}),await O.after(),await fe(),O.listen({port:Xe,host:"127.0.0.1"},(t,e)=>{t&&(console.error(t),process.exit(1)),console.log(`Server listening at ${e}`)})}xt();
|