@dataramen/cli 0.0.74 → 0.0.75-beta.1

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,9 +1,9 @@
1
- "use strict";var oo=Object.create;var Be=Object.defineProperty;var ao=Object.getOwnPropertyDescriptor;var no=Object.getOwnPropertyNames;var so=Object.getPrototypeOf,io=Object.prototype.hasOwnProperty;var uo=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of no(t))!io.call(e,a)&&a!==r&&Be(e,a,{get:()=>t[a],enumerable:!(o=ao(t,a))||o.enumerable});return e};var O=(e,t,r)=>(r=e!=null?oo(so(e)):{},uo(t||!e||!e.__esModule?Be(r,"default",{value:e,enumerable:!0}):r,e));var te=require("dotenv"),re=require("node:path"),Qe=require("node:fs");var Z=e=>{function t(a,n=void 0){return e[a]||n}function r(a,n=void 0){let i=e[a];if(!i)return n;let s=Number(i);return!isNaN(s)&&i.trim()!==""?s:n}function o(a){return e[a]==="true"||e[a]==="TRUE"||e[a]==="1"}return{str:t,num:r,bool:o}};function co(e){let t={mode:void 0,env:void 0};for(let r of e){if(!r.startsWith("--"))continue;let[o,...a]=r.slice(2).split("=");if(!o||a.length===0)continue;let n=a.join("=");n=n.replace(/^["'](.+)["']$/,"$1"),t[o]=n}return t}var ee=Z(co(process.argv.slice(2)));var mo=(()=>{try{let e=(0,Qe.readFileSync)((0,re.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})(),Fe=[],Me=ee.str("env");Me&&Fe.push((0,re.resolve)(Me));(0,te.config)({path:Fe});var ye={APP_DB_TYPE:"sqlite",APP_DB_DATABASE:"<home>/.dataramen/.runtime/db.sqlite3"};(0,te.populate)(process.env,{SERVER_VERSION:mo.version,PROD:"true",...ye},{override:!1});var lo=["SYMM_ENCRYPTION_KEY","JWT_SECRET","JWT_REFRESH_SECRET"],$e=()=>{let e=[];for(let t of lo)process.env[t]||e.push(t);if(e.length>0)throw new Error("Following env variables are required but not provided: "+e.join(", "))},T=Z(process.env),He=()=>T.str("APP_DB_TYPE")!==ye.APP_DB_TYPE&&T.str("APP_DB_DATABASE")!==ye.APP_DB_DATABASE;var fm=require("reflect-metadata"),Kr=O(require("fastify")),Vr=O(require("qs"));var et=require("typeorm");var We=require("typeorm");var po={default:{bindServerUrl:"0.0.0.0",skipAuth:!1,name:"default"},docker:{bindServerUrl:"0.0.0.0",skipAuth:!1,name:"docker"},cli:{bindServerUrl:"127.0.0.1",skipAuth:!0,name:"cli"},dev:{bindServerUrl:"127.0.0.1",skipAuth:!0,name:"dev"}},fo=ee.str("mode","default"),D=po[fo];var g=T.str("APP_DB_TYPE")==="sqlite"?"datetime":"timestamp",oe=D.name==="docker"?e=>e==="localhost"||e==="127.0.0.1"?"host.docker.internal":e:e=>e;var Te=new We.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0}},relations:{users:{type:"one-to-many",target:()=>"UsersToTeams",inverseSide:"team"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"team"},datasources:{type:"one-to-many",target:()=>"DataSource",inverseSide:"team"}}});var Ye=require("typeorm");var ge=new Ye.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0},username:{type:String,unique:!0},password:{type:String}},relations:{teams:{type:"one-to-many",target:()=>"UsersToTeams",inverseSide:"user"},settings:{type:"one-to-one",target:()=>"UserSettings",inverseSide:"user"},currentTeam:{type:"one-to-one",target:()=>"UsersToTeams",inverseSide:"user",joinColumn:!0},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"user"}}});var Ge=require("typeorm");var he=new Ge.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var je=require("typeorm");var be=new je.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,select:!1},dbPasswordIv:{type:String,nullable:!0,select:!1},dbPasswordTag:{type:String,nullable:!0,select:!1},dbType:{type:String},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0},name:{type:String},description:{type:String,nullable:!0},dbDatabase:{type:String},dbSchema:{type:String,nullable:!0},allowInsert:{type:Boolean,default:!1},allowUpdate:{type:Boolean,default:!1},lastInspected:{type:g,nullable:!0,default:null},status:{type:String,nullable:!0}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"datasources",joinColumn:!0},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"dataSource"},owner:{type:"many-to-one",target:()=>"User",joinColumn:!0}}});var tt=O(require("node:os")),rt=require("node:path");var Ke=require("typeorm");var we=new Ke.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",nullable:!1},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"queries",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",inverseSide:"datasources",joinColumn:!0},user:{type:"many-to-one",target:()=>"User",inverseSide:"queries",joinColumn:!0,nullable:!0}}});var Ve=require("typeorm"),Se=new Ve.EntitySchema({name:"UsersToTeams",tableName:"users_to_teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},role:{type:"varchar",default:"admin",nullable:!1}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"users"},user:{type:"many-to-one",target:()=>"User",inverseSide:"teams"}}});var ze=require("typeorm");var Ie=new ze.EntitySchema({name:"SavedQuery",tableName:"saved_queries",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},isPersonal:{type:Boolean},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0},searchString:{type:String,default:()=>null}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"queries",joinColumn:!0},user:{type:"many-to-one",target:()=>"User",inverseSide:"queries",joinColumn:!0,nullable:!0},query:{type:"one-to-one",target:()=>"Query",joinColumn:!0,nullable:!1}}});var Je=require("typeorm");var Ee=new Je.EntitySchema({name:"WorkbenchTab",tableName:"workbench_tabs",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0},opts:{type:"json",nullable:!1},archived:{type:Boolean,default:!1},searchString:{type:String,default:()=>null}},relations:{team:{type:"many-to-one",target:()=>"Team",joinColumn:!0},user:{type:"many-to-one",target:()=>"User",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",joinColumn:!0}}});var Xe=require("typeorm");var Ce=new Xe.EntitySchema({name:"DatabaseColumn",tableName:"database_columns",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},name:{nullable:!0,type:String},type:{type:String},isPrimary:{type:Boolean},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0},meta:{type:"json",nullable:!0}},relations:{table:{target:()=>"DatabaseTable",type:"many-to-one",inverseSide:"columns"}}});var Ze=require("typeorm");var Re=new Ze.EntitySchema({name:"DatabaseTable",tableName:"database_tables",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},name:{nullable:!0,type:String},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one"},columns:{target:()=>"DatabaseColumn",type:"one-to-many",inverseSide:"table"}}});function yo(){let e=T.str("APP_DB_DATABASE");if(!e)throw new Error("Bad value for TYPEORM_DATABASE. Please check your config!");return e.startsWith("<home>")&&(e=e.replace("<home>",tt.default.homedir())),e}var b=new et.DataSource({type:T.str("APP_DB_TYPE"),database:yo(),host:T.str("APP_DB_HOST"),username:T.str("APP_DB_USERNAME"),password:T.str("APP_DB_PASSWORD"),port:T.num("APP_DB_PORT"),schema:T.str("APP_DB_SCHEMA"),logging:T.bool("APP_DB_LOGGING"),migrationsRun:!0,migrations:[rt.posix.join(__dirname,"migrations","*.js")],entities:[be,Te,ge,Se,he,we,Ie,Ee,Re,Ce]}),ot=async()=>{if(!b.isInitialized)return b.initialize();throw new Error("Already initialized")},I=b.getRepository(be),k=b.getRepository(Te),w=b.getRepository(ge),R=b.getRepository(Se),H=b.getRepository(he),E=b.getRepository(we),v=b.getRepository(Ie),A=b.getRepository(Ee),q=b.getRepository(Ce),F=b.getRepository(Re);var at=T.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),nt=T.num("PORT",4466),j={port:nt,host:D.bindServerUrl,allowedOrigins:at.includes("*")?"*":[`http://localhost:${nt}`,...at]};var h=e=>(t,r,o)=>{e(t),o()};var K=require("jose");var u=class extends Error{constructor(r,o){super(o);this.status=r;this.message=o}};var st=new TextEncoder,it=st.encode(T.str("JWT_SECRET")),ut=st.encode(T.str("JWT_REFRESH_SECRET")),Ne=async({userId:e})=>new K.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign(it),Ae=async({userId:e})=>new K.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign(ut),ct=async(e,t)=>{try{let{payload:r}=await(0,K.jwtVerify)(e,t);if(!r.sub)throw new u(401,"Failed to verify access token");return{userId:r.sub}}catch(r){throw r instanceof u?r:r instanceof Error?new u(401,r.message):new u(401,"Failed to verify refresh token")}},mt=async e=>ct(e,it),lt=async e=>ct(e,ut);var y=(e,t)=>{let r=e.body;return t&&t(r),r},_=(e,t)=>{let r=e.query;return t&&t(r),r},f=(e,t)=>{let r=e.params;return t&&t(r),r};var pt=O(require("bcryptjs"));var dt=e=>{if(!e?.username)throw new u(400,"Username is required");if(!e?.password)throw new u(400,"Password is required")};var ae="DATARAMEN_refresh_token",Pe={httpOnly:!0,secure:T.bool("PROD"),sameSite:T.bool("PROD"),path:"/",maxAge:14400*60},ft=h(e=>{e.route({method:"post",url:"/login",config:{isPublic:!0},handler:async(t,r)=>{let{username:o,password:a}=y(t,dt),n=await w.findOne({where:{username:o}});if(!n||!pt.default.compareSync(a,n.password))throw new u(401,"Invalid credentials");let[i,s]=await Promise.all([Ne({userId:n?.id}),Ae({userId:n?.id})]);return r.setCookie(ae,s,Pe),{data:{accessToken:i}}}}),e.route({method:"post",url:"/refresh",config:{isPublic:!0},handler:async(t,r)=>{let o=t.cookies[ae];if(!o)return r.code(401).send({message:"Missing refresh token"});let{userId:a}=await lt(o),[n,i]=await Promise.all([Ne({userId:a}),Ae({userId:a})]);return r.setCookie(ae,i,Pe),{data:{accessToken:n}}}}),e.route({method:"post",url:"/logout",config:{isPublic:!0},handler:async(t,r)=>(r.clearCookie(ae,Pe),{data:!0})})});var yt=e=>{if(!e.dbUrl)throw new u(400,"url is required");if(!e.dbUser)throw new u(400,"user is required");if(!e.dbType)throw new u(400,"type is required");if(!e.name)throw new u(400,"name is required");if(!e.dbDatabase)throw new u(400,"database is required")};var ht=O(require("mysql2/promise"));function V(e){if(e!==void 0)return e.toLowerCase()}var To=({database:e,password:t,user:r,url:o})=>ht.default.createConnection({host:oe(o),user:r,database:e,password:t,dateStrings:!0}),go=async e=>{let t=`
1
+ "use strict";var oo=Object.create;var Be=Object.defineProperty;var ao=Object.getOwnPropertyDescriptor;var no=Object.getOwnPropertyNames;var so=Object.getPrototypeOf,io=Object.prototype.hasOwnProperty;var uo=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of no(t))!io.call(e,a)&&a!==r&&Be(e,a,{get:()=>t[a],enumerable:!(o=ao(t,a))||o.enumerable});return e};var O=(e,t,r)=>(r=e!=null?oo(so(e)):{},uo(t||!e||!e.__esModule?Be(r,"default",{value:e,enumerable:!0}):r,e));var oe=require("dotenv"),ae=require("node:path"),Fe=require("node:fs");var te=e=>{function t(a,n=void 0){return e[a]||n}function r(a,n=void 0){let i=e[a];if(!i)return n;let s=Number(i);return!isNaN(s)&&i.trim()!==""?s:n}function o(a){return e[a]==="true"||e[a]==="TRUE"||e[a]==="1"}return{str:t,num:r,bool:o}};function co(e){let t={mode:void 0,env:void 0};for(let r of e){if(!r.startsWith("--"))continue;let[o,...a]=r.slice(2).split("=");if(!o||a.length===0)continue;let n=a.join("=");n=n.replace(/^["'](.+)["']$/,"$1"),t[o]=n}return t}var re=te(co(process.argv.slice(2)));var mo=(()=>{try{let e=(0,Fe.readFileSync)((0,ae.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})(),Me=[],Qe=re.str("env");Qe&&Me.push((0,ae.resolve)(Qe));(0,oe.config)({path:Me});var be={APP_DB_TYPE:"sqlite",APP_DB_DATABASE:"<home>/.dataramen/.runtime/db.sqlite3"};(0,oe.populate)(process.env,{SERVER_VERSION:mo.version,PROD:"true",...be},{override:!1});var lo=["SYMM_ENCRYPTION_KEY","JWT_SECRET","JWT_REFRESH_SECRET"],$e=()=>{let e=[];for(let t of lo)process.env[t]||e.push(t);if(e.length>0)throw new Error("Following env variables are required but not provided: "+e.join(", "))},T=te(process.env),He=()=>T.str("APP_DB_TYPE")!==be.APP_DB_TYPE&&T.str("APP_DB_DATABASE")!==be.APP_DB_DATABASE;var wm=require("reflect-metadata"),Kr=O(require("fastify")),Vr=O(require("qs"));var et=require("typeorm");var We=require("typeorm");var po={default:{bindServerUrl:"0.0.0.0",skipAuth:!1,name:"default"},docker:{bindServerUrl:"0.0.0.0",skipAuth:!1,name:"docker"},cli:{bindServerUrl:"127.0.0.1",skipAuth:!0,name:"cli"},dev:{bindServerUrl:"127.0.0.1",skipAuth:!0,name:"dev"}},fo=re.str("mode","default"),D=po[fo];var g=T.str("APP_DB_TYPE")==="sqlite"?"datetime":"timestamp",ne=D.name==="docker"?e=>e==="localhost"||e==="127.0.0.1"?"host.docker.internal":e:e=>e;var we=new We.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0}},relations:{users:{type:"one-to-many",target:()=>"UsersToTeams",inverseSide:"team"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"team"},datasources:{type:"one-to-many",target:()=>"DataSource",inverseSide:"team"}}});var Ye=require("typeorm");var Se=new Ye.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0},username:{type:String,unique:!0},password:{type:String}},relations:{teams:{type:"one-to-many",target:()=>"UsersToTeams",inverseSide:"user"},settings:{type:"one-to-one",target:()=>"UserSettings",inverseSide:"user"},currentTeam:{type:"one-to-one",target:()=>"UsersToTeams",inverseSide:"user",joinColumn:!0},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"user"}}});var Ge=require("typeorm");var Ie=new Ge.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var je=require("typeorm");var k=new je.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,select:!1},dbPasswordIv:{type:String,nullable:!0,select:!1},dbPasswordTag:{type:String,nullable:!0,select:!1},dbType:{type:String},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0},name:{type:String},description:{type:String,nullable:!0},dbDatabase:{type:String},dbSchema:{type:String,nullable:!0},allowInsert:{type:Boolean,default:!1},allowUpdate:{type:Boolean,default:!1},lastInspected:{type:g,nullable:!0,default:null},status:{type:String,nullable:!0}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"datasources",joinColumn:!0},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"dataSource"},owner:{type:"many-to-one",target:()=>"User",joinColumn:!0}}});var tt=O(require("node:os")),rt=require("node:path");var Ke=require("typeorm");var K=new Ke.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",nullable:!1},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"queries",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",inverseSide:"datasources",joinColumn:!0},user:{type:"many-to-one",target:()=>"User",inverseSide:"queries",joinColumn:!0,nullable:!0}}});var Ve=require("typeorm"),Ee=new Ve.EntitySchema({name:"UsersToTeams",tableName:"users_to_teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},role:{type:"varchar",default:"admin",nullable:!1}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"users"},user:{type:"many-to-one",target:()=>"User",inverseSide:"teams"}}});var ze=require("typeorm");var Ce=new ze.EntitySchema({name:"SavedQuery",tableName:"saved_queries",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},isPersonal:{type:Boolean},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0},searchString:{type:String,default:()=>null}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"queries",joinColumn:!0},user:{type:"many-to-one",target:()=>"User",inverseSide:"queries",joinColumn:!0,nullable:!0},query:{type:"one-to-one",target:()=>"Query",joinColumn:!0,nullable:!1}}});var Je=require("typeorm");var Re=new Je.EntitySchema({name:"WorkbenchTab",tableName:"workbench_tabs",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0},opts:{type:"json",nullable:!1},archived:{type:Boolean,default:!1},searchString:{type:String,default:()=>null}},relations:{team:{type:"many-to-one",target:()=>"Team",joinColumn:!0},user:{type:"many-to-one",target:()=>"User",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",joinColumn:!0}}});var Xe=require("typeorm");var q=new Xe.EntitySchema({name:"DatabaseColumn",tableName:"database_columns",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},name:{nullable:!0,type:String},type:{type:String},isPrimary:{type:Boolean},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0},meta:{type:"json",nullable:!0},tableId:{type:String}},relations:{table:{target:()=>"DatabaseTable",type:"many-to-one",inverseSide:"columns"}}});var Ze=require("typeorm");var B=new Ze.EntitySchema({name:"DatabaseTable",tableName:"database_tables",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},name:{nullable:!0,type:String},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one"},columns:{target:()=>"DatabaseColumn",type:"one-to-many",inverseSide:"table"}}});function yo(){let e=T.str("APP_DB_DATABASE");if(!e)throw new Error("Bad value for TYPEORM_DATABASE. Please check your config!");return e.startsWith("<home>")&&(e=e.replace("<home>",tt.default.homedir())),e}var b=new et.DataSource({type:T.str("APP_DB_TYPE"),database:yo(),host:T.str("APP_DB_HOST"),username:T.str("APP_DB_USERNAME"),password:T.str("APP_DB_PASSWORD"),port:T.num("APP_DB_PORT"),schema:T.str("APP_DB_SCHEMA"),logging:T.bool("APP_DB_LOGGING"),migrationsRun:!0,migrations:[rt.posix.join(__dirname,"migrations","*.js")],entities:[k,we,Se,Ee,Ie,K,Ce,Re,B,q]}),ot=async()=>{if(!b.isInitialized)return b.initialize();throw new Error("Already initialized")},R=b.getRepository(k),Q=b.getRepository(we),w=b.getRepository(Se),E=b.getRepository(Ee),W=b.getRepository(Ie),C=b.getRepository(K),v=b.getRepository(Ce),A=b.getRepository(Re),se=b.getRepository(q),ie=b.getRepository(B);var at=T.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),nt=T.num("PORT",4466),V={port:nt,host:D.bindServerUrl,allowedOrigins:at.includes("*")?"*":[`http://localhost:${nt}`,...at]};var h=e=>(t,r,o)=>{e(t),o()};var z=require("jose");var u=class extends Error{constructor(r,o){super(o);this.status=r;this.message=o}};var st=new TextEncoder,it=st.encode(T.str("JWT_SECRET")),ut=st.encode(T.str("JWT_REFRESH_SECRET")),Ne=async({userId:e})=>new z.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign(it),Ae=async({userId:e})=>new z.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign(ut),ct=async(e,t)=>{try{let{payload:r}=await(0,z.jwtVerify)(e,t);if(!r.sub)throw new u(401,"Failed to verify access token");return{userId:r.sub}}catch(r){throw r instanceof u?r:r instanceof Error?new u(401,r.message):new u(401,"Failed to verify refresh token")}},mt=async e=>ct(e,it),lt=async e=>ct(e,ut);var y=(e,t)=>{let r=e.body;return t&&t(r),r},_=(e,t)=>{let r=e.query;return t&&t(r),r},f=(e,t)=>{let r=e.params;return t&&t(r),r};var pt=O(require("bcryptjs"));var dt=e=>{if(!e?.username)throw new u(400,"Username is required");if(!e?.password)throw new u(400,"Password is required")};var ue="DATARAMEN_refresh_token",Pe={httpOnly:!0,secure:T.bool("PROD"),sameSite:T.bool("PROD"),path:"/",maxAge:14400*60},ft=h(e=>{e.route({method:"post",url:"/login",config:{isPublic:!0},handler:async(t,r)=>{let{username:o,password:a}=y(t,dt),n=await w.findOne({where:{username:o}});if(!n||!pt.default.compareSync(a,n.password))throw new u(401,"Invalid credentials");let[i,s]=await Promise.all([Ne({userId:n?.id}),Ae({userId:n?.id})]);return r.setCookie(ue,s,Pe),{data:{accessToken:i}}}}),e.route({method:"post",url:"/refresh",config:{isPublic:!0},handler:async(t,r)=>{let o=t.cookies[ue];if(!o)return r.code(401).send({message:"Missing refresh token"});let{userId:a}=await lt(o),[n,i]=await Promise.all([Ne({userId:a}),Ae({userId:a})]);return r.setCookie(ue,i,Pe),{data:{accessToken:n}}}}),e.route({method:"post",url:"/logout",config:{isPublic:!0},handler:async(t,r)=>(r.clearCookie(ue,Pe),{data:!0})})});var yt=e=>{if(!e.dbUrl)throw new u(400,"url is required");if(!e.dbUser)throw new u(400,"user is required");if(!e.dbType)throw new u(400,"type is required");if(!e.name)throw new u(400,"name is required");if(!e.dbDatabase)throw new u(400,"database is required")};var ht=O(require("mysql2/promise"));function J(e){if(e!==void 0)return e.toLowerCase()}var To=({database:e,password:t,user:r,url:o})=>ht.default.createConnection({host:ne(o),user:r,database:e,password:t,dateStrings:!0}),go=async e=>{let t=`
2
2
  SELECT LOWER(TABLE_NAME) as 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 e.execute(t),o={};return r.forEach(a=>{let n=V(a.TABLE_NAME),i=a.COLUMN_NAME;o[n]||(o[n]=[]),o[n].push(i)}),o},ho=async e=>{let t=`
6
+ `,[r]=await e.execute(t),o={};return r.forEach(a=>{let n=J(a.TABLE_NAME),i=a.COLUMN_NAME;o[n]||(o[n]=[]),o[n].push(i)}),o},ho=async e=>{let t=`
7
7
  SELECT
8
8
  LOWER(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 e.execute(t),o={};return Array.isArray(r)&&r.forEach(a=>{o[a.table_name]||(o[a.table_name]={}),o[a.table_name][a.field]={refTable:a.referenced_table,refField:a.referenced_field}}),o},bo=async(e,t)=>{let o=(await t.query("SHOW TABLES"))[0],a=await ho(t),n=await go(t),i=o.map(async s=>{let m=V(Object.values(s)[0]),c=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${e.database}' and LOWER(table_name) = '${m}'`,[l]=await t.query(c),d=a[m];return{columns:l.map(p=>({name:p.COLUMN_NAME,type:p.DATA_TYPE,isPrimary:n[m]?.includes(p.COLUMN_NAME),ref:d?.[p.COLUMN_NAME]?{table:d[p.COLUMN_NAME].refTable,field:d[p.COLUMN_NAME].refField}:void 0})),createdAt:new Date,tableName:m,updatedAt:new Date}});return Promise.all(i)},Tt=async(e,t,r,o)=>{try{console.log(`[MYSQL CONN] Query: ${e}`),console.log(`[MYSQL CONN] Params: ${JSON.stringify(t)}`);let[a,n]=await r.query({sql:e,rowsAsArray:!0,values:t,timeout:1e4}),i=a?.constructor?.name;if(i==="ResultSetHeader"){let s=a;if(s.affectedRows>1&&o.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(i==="Array"){let s=a;return{columns:n?.map(m=>({column:m.orgName||m.name,table:V(m.orgTable),alias:m.name,full:m.orgTable?V(m.orgTable)+"."+m.orgName:m.name}))||[],rows:s,query:e}}throw new Error(`[MYSQL CONN] Unknown result type: ${i}`)}catch(a){throw console.error(a),a instanceof u?a:new u(400,a.message)}},wo=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}},So=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}},bt=async e=>{let t=await To(e),r=!1;return{dbType:"mysql",dataSource:e,inspectSchema:()=>bo(e,t),executeQuery:o=>o.type==="SELECT"?So(t,()=>Tt(o.sql,o.params,t,o)):wo(t,()=>Tt(o.sql,o.params,t,o)),checkConnection:async()=>t.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.destroy()}}};var St=O(require("pg"));var Io=async({database:e,password:t,user:r,url:o,port:a})=>{let n=new St.default.Client({host:oe(o),user:r,database:e,password:t,port:a,query_timeout:1e4});return await n.connect(),n},Eo=async e=>{let r=await e.query(`
17
+ `,[r]=await e.execute(t),o={};return Array.isArray(r)&&r.forEach(a=>{o[a.table_name]||(o[a.table_name]={}),o[a.table_name][a.field]={refTable:a.referenced_table,refField:a.referenced_field}}),o},bo=async(e,t)=>{let o=(await t.query("SHOW TABLES"))[0],a=await ho(t),n=await go(t),i=o.map(async s=>{let m=J(Object.values(s)[0]),c=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${e.database}' and LOWER(table_name) = '${m}'`,[l]=await t.query(c),p=a[m];return{columns:l.map(d=>({name:d.COLUMN_NAME,type:d.DATA_TYPE,isPrimary:n[m]?.includes(d.COLUMN_NAME),ref:p?.[d.COLUMN_NAME]?{table:p[d.COLUMN_NAME].refTable,field:p[d.COLUMN_NAME].refField}:void 0})),createdAt:new Date,tableName:m,updatedAt:new Date}});return Promise.all(i)},Tt=async(e,t,r,o)=>{try{console.log(`[MYSQL CONN] Query: ${e}`),console.log(`[MYSQL CONN] Params: ${JSON.stringify(t)}`);let[a,n]=await r.query({sql:e,rowsAsArray:!0,values:t,timeout:1e4}),i=a?.constructor?.name;if(i==="ResultSetHeader"){let s=a;if(s.affectedRows>1&&o.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(i==="Array"){let s=a;return{columns:n?.map(m=>({column:m.orgName||m.name,table:J(m.orgTable),alias:m.name,full:m.orgTable?J(m.orgTable)+"."+m.orgName:m.name}))||[],rows:s,query:e}}throw new Error(`[MYSQL CONN] Unknown result type: ${i}`)}catch(a){throw console.error(a),a instanceof u?a:new u(400,a.message)}},wo=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}},So=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}},bt=async e=>{let t=await To(e),r=!1;return{dbType:"mysql",dataSource:e,inspectSchema:()=>bo(e,t),executeQuery:o=>o.type==="SELECT"?So(t,()=>Tt(o.sql,o.params,t,o)):wo(t,()=>Tt(o.sql,o.params,t,o)),checkConnection:async()=>t.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.destroy()}}};var St=O(require("pg"));var Io=async({database:e,password:t,user:r,url:o,port:a})=>{let n=new St.default.Client({host:ne(o),user:r,database:e,password:t,port:a,query_timeout:1e4});return await n.connect(),n},Eo=async e=>{let r=await e.query(`
18
18
  SELECT
19
19
  LOWER(kcu.table_name) as table_name,
20
20
  kcu.column_name,
@@ -49,10 +49,10 @@
49
49
  WHERE
50
50
  LOWER(table_name) = '${c}' and
51
51
  table_schema = '${e.schema}'
52
- `,{rows:d}=await t.query(l),p=n[c];return{columns:d.map(N=>({name:N.column_name,type:N.data_type,isPrimary:i[c]?.includes(N.column_name),ref:p?.[N.column_name]?{table:p[N.column_name].refTable,field:p[N.column_name].refField}:void 0})).sort((N,L)=>N.isPrimary&&L.isPrimary?N.name.localeCompare(L.name):N.isPrimary?-1:1),createdAt:new Date,tableName:c,updatedAt:new Date}});return Promise.all(s)},No=async(e,t)=>{let r=`select LOWER(relname) as relname, attname, concat(pg_class.oid, '-', attnum) as row_key
52
+ `,{rows:p}=await t.query(l),d=n[c];return{columns:p.map(N=>({name:N.column_name,type:N.data_type,isPrimary:i[c]?.includes(N.column_name),ref:d?.[N.column_name]?{table:d[N.column_name].refTable,field:d[N.column_name].refField}:void 0})).sort((N,L)=>N.isPrimary&&L.isPrimary?N.name.localeCompare(L.name):N.isPrimary?-1:1),createdAt:new Date,tableName:c,updatedAt:new Date}});return Promise.all(s)},No=async(e,t)=>{let r=`select LOWER(relname) as 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 (${e.join(", ")})
57
- limit 75;`;return(await t.query(r)).rows.reduce((a,n)=>(a[n.row_key]={table:n.relname,column:n.attname},a),{})},wt=async(e,t,r,o)=>{try{console.log(`[PG CONN] Query: ${e}`),console.log(`[PG CONN] Params: ${JSON.stringify(t,null,2)}`);let{rows:a,fields:n,command:i,rowCount:s}=await r.query({text:e,rowMode:"array",values:t});if(i==="UPDATE"||i==="INSERT"||i==="DELETE"){if(s!=null&&s>1&&o.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(i==="SELECT"){let m=n.map(l=>`'${l.tableID}-${l.columnID}'`),c=await No(m,r);return{columns:n.map(l=>{let d=c[`${l.tableID}-${l.columnID}`];return{column:d?.column||l.name,alias:l.name,table:d?.table||"",full:d?d.table+"."+d.column:l.name}}),rows:a,query:e}}throw new Error(`[PG CONN] Unsupported command: ${i}`)}catch(a){throw a instanceof u?a:new u(400,a.message)}},Ao=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}},Po=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}},It=async e=>{let t=await Io(e),r=!1,o=!1,a=async n=>(o||await t.query(`SET search_path TO ${e.schema}`),n());return{dbType:"postgres",dataSource:e,inspectSchema:()=>Ro(e,t),executeQuery:n=>a(()=>n.type==="SELECT"?Po(t,()=>wt(n.sql,n.params,t,n)):Ao(t,()=>wt(n.sql,n.params,t,n))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.end()}}};var B=async(e,t,r)=>{try{let o;if(t==="mysql")o=await bt(e);else if(t==="postgres")o=await It(e);else throw new u(500,`Connection manager for ${t} not found`);return r.__connections?r.__connections.push(o):r.__connections=[o],o}catch(o){throw console.error(o),o instanceof u?o:o?.code==="ECONNREFUSED"?new u(500,"Failed to connect to the database"):new u(500,o.message)}};var ne=O(require("node:crypto"));var Et="aes-256-gcm",Oo=12,Ct=()=>{let e=T.str("SYMM_ENCRYPTION_KEY");if(!e)throw new Error("Missing ENCRYPTION_KEY in environment variables.");let t=Buffer.from(e,"hex");if(t.length!==32)throw new Error("ENCRYPTION_KEY must be a 64-character hex string (256 bits).");return t},Do=e=>{let t=ne.default.randomBytes(Oo),r=Ct(),o=ne.default.createCipheriv(Et,r,t),a=o.update(e,"utf8","hex");a+=o.final("hex");let n=o.getAuthTag();return{encrypted:a,iv:t.toString("hex"),tag:n.toString("hex")}},xo=({encrypted:e,iv:t,tag:r})=>{let o=Ct(),a=ne.default.createDecipheriv(Et,o,Buffer.from(t,"hex"));a.setAuthTag(Buffer.from(r,"hex"));let n=a.update(e,"hex","utf8");return n+=a.final("utf8"),n},se={encrypt:Do,decrypt:xo};var M=(e,t=!1)=>{if(t){let r=se.decrypt({encrypted:e.dbPassword,tag:e.dbPasswordTag,iv:e.dbPasswordIv});return{url:e.dbUrl,user:e.dbUser,database:e.dbDatabase,password:r,port:e.dbPort,schema:e.dbSchema}}return{url:e.dbUrl,user:e.dbUser,database:e.dbDatabase,password:e.dbPassword,port:e.dbPort,schema:e.dbSchema}};var Rt=[{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:"like"},{value:"NOT LIKE",label:"not like"},{value:"CONTAINS",label:"contains"},{value:"NOT CONTAINS",label:"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"}],vo=Rt.reduce((e,t)=>(e[t.value]=t.label,e),{}),us=Rt.reduce((e,t)=>(e[t.label]=t.value,e),{}),W=e=>e.map(t=>({label:vo[t],value:t})),cs=W(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),ms=W(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL","CONTAINS","NOT CONTAINS"]),ls=W(["=","<>","IS NULL","IS NOT NULL"]),ds=W(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),ps=W(["IS NULL","IS NOT NULL"]),fs=W(["IN","NOT IN"]),_o=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"],Uo=new Set(_o),ie=e=>Uo.has(e),Lo=["integer","smallint","decimal","numeric","float","real","double precision","int","smallint","integer","bigint","decimal","numeric","real","double precision","serial","bigserial","money"],ko=new Set(Lo),Nt=e=>ko.has(e);var ys=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var Oe={read_only:10,editor:20,admin:30,owner:40};var P=e=>e.startsWith("'")&&e.endsWith("'")||e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e;var At={operator:"LIKE",parse:e=>{let t=e.match(/^LIKE\s*["'](.*)["']$/i);if(t)return[{value:P(t[1])}]},stringify:e=>`LIKE "%${e[0]?.value}%"`},Pt={operator:"NOT LIKE",parse:e=>{let t=e.match(/^NOT LIKE\s*["'](.*)["']$/i);if(t)return[{value:P(t[1])}]},stringify:e=>`NOT LIKE "%${e[0]?.value}%"`},Ot={operator:"CONTAINS",parse:e=>{let t=e.match(/^CONTAINS\s*["'](.*)["']$/i);if(t)return[{value:P(t[1])}]},stringify:(e,t)=>ie(t)?`${e[0]?.value}`:`CONTAINS "%${e[0]?.value}%"`},Dt={operator:"NOT CONTAINS",parse:e=>{let t=e.match(/^NOT CONTAINS\s*["'](.*)["']$/i);if(t)return[{value:P(t[1])}]},stringify:e=>`NOT CONTAINS "%${e[0]?.value}%"`};function vt(e){return e===""?[]:qo(e).map(Bo)}function qo(e){let t=[],r=0,o="",a=!1,n=!1;for(;r<e.length;){let i=e[r];if((a||n)&&i==="\\"){o+=e[r+1],r+=2;continue}if(i==="'"&&!n){a=!a,o+=i,r++;continue}if(i==='"'&&!a){n=!n,o+=i,r++;continue}if(i===","&&!a&&!n){t.push(o.trim()),o="",r++;continue}o+=i,r++}if(o.trim()!==""&&t.push(o.trim()),a||n)throw new Error("Unterminated string literal");return t}function Bo(e){if(e.startsWith("'")&&e.endsWith("'"))return{value:xt(e.slice(1,-1),"'")};if(e.startsWith('"')&&e.endsWith('"'))return{value:xt(e.slice(1,-1),'"')};let t=Number(e);if(!Number.isNaN(t))return{value:t};throw new Error(`Invalid literal: ${e}`)}function xt(e,t){return e.replace(/\\(.)/g,(r,o)=>o)}var _t={operator:"IN",parse:e=>{let t=e.match(/^in\s*\((.*)\)$/i);if(t)return vt(t[1])},stringify:e=>`IN (${e?.map(t=>`"${t.value}"`).join(", ")})`},Ut={operator:"NOT IN",parse:e=>{let t=e.match(/^not\s+in\s*\((.*)\)$/i);if(t)return vt(t[1])},stringify:e=>`NOT IN (${e?.map(t=>`"${t.value}"`).join(", ")})`};var Lt={operator:"=",parse:e=>{let t=e.match(/^=\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:(e,t)=>Nt(t)?`${e[0]?.value}`:`= ${e[0]?.value}`},kt={operator:"!=",parse:e=>{let t=e.match(/^!=\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`!= ${e[0]?.value}`},qt={operator:"<>",parse:e=>{let t=e.match(/^<>\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`<> ${e[0]?.value}`},Bt={operator:">",parse:e=>{let t=e.match(/^>\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`> ${e[0]?.value}`},Mt={operator:">=",parse:e=>{let t=e.match(/^>=\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`>= ${e[0]?.value}`},Qt={operator:"<",parse:e=>{let t=e.match(/^<\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`< ${e[0]?.value}`},Ft={operator:"<=",parse:e=>{let t=e.match(/^<=\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`<= ${e[0]?.value}`};var $t={operator:"IS NULL",parse:e=>{if(/^is\s+null$/i.test(e))return[]},stringify:()=>"IS NULL"},Ht={operator:"IS NOT NULL",parse:e=>{if(/^is\s+not\s+null$/i.test(e))return[]},stringify:()=>"IS NOT NULL"};var Mo=[At,Ot,Pt,Dt,_t,Ut,Lt,kt,qt,Mt,Bt,Ft,Qt,$t,Ht];function Qo(e){let t=e.trim();for(let r of Mo){let o=r.parse(t);if(o)return{operator:r.operator,value:o}}}var Wt={parse:Qo};var S=e=>{let t=Oe[e];return r=>Oe[r.currentTeamRole]>=t},Yt=async e=>{let t=e.routeOptions.config.requireRole;if(t&&!t(e.user))throw new u(403,"You are not authorized to perform this action")};var De=async e=>{let t=await q.find({where:{table:{datasource:{id:e}}},relations:{table:!0}});await q.remove(t),await F.delete({datasource:{id:e}})};function Fo(e){let t=new Map;for(let r of e)r.columns?.forEach(o=>{if(o.ref){let a=`${o.ref.table}.${o.ref.field}`,n=t.get(a)||[];n.push({table:r.tableName,field:o.name}),t.set(a,n)}});return t}var Gt=h(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=f(t),o=await I.findOne({where:{id:r}});if(!o)throw new u(404,"Data source not found");return{data:o}}}),e.route({method:"get",url:"/",handler:async t=>{let{teamId:r}=_(t);return{data:await I.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",config:{requireRole:S("admin")},handler:async t=>{let{teamId:r,ownerId:o,...a}=y(t,yt),n=I.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),i=await B(M(n),n.dbType,t);try{await i.checkConnection()}catch{throw new u(400,"Cannot connect to the database, please check datasource configuration")}let{tag:s,iv:m,encrypted:c}=se.encrypt(n.dbPassword);return n.dbPassword=c,n.dbPasswordIv=m,n.dbPasswordTag=s,{data:await I.save(n)}}}),e.route({method:"put",url:"/:id",config:{requireRole:S("admin")},handler:async t=>{let{id:r}=f(t),o=y(t),a=await I.findOneBy({id:r});if(!a)throw new u(404,"Data source not found");let n=I.merge(a,o);return await I.save(n),{data:n}}}),e.route({method:"delete",url:"/:id",config:{requireRole:S("admin")},handler:async t=>b.transaction(async()=>{let{id:r}=f(t);await Promise.all([De(r),E.delete({dataSource:{id:r}})]),await I.delete({id:r})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=f(t),a=await I.findOne({where:{id:o},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]});if(!a)throw new Error("Data source not found");a.status="INSPECTING",await I.save(a);let i=await(await B(M(a,!0),a.dbType,t)).inspectSchema();await De(a.id);let s=Fo(i);for(let m of i){let c=await F.save({datasource:{id:o},name:m.tableName});if(m.columns){let l=[];for(let d of m.columns)l.push(q.create({table:{id:c.id},name:d.name,isPrimary:d.isPrimary,type:d.type,meta:{refs:d.ref,referencedBy:s.get(`${c.name}.${d.name}`)}}));await q.save(l)}}a.status="READY",a.lastInspected=new Date,await I.save(a)}}),e.route({method:"get",url:"/:id/inspections",handler:async t=>{let{id:r}=f(t);return{data:(await F.find({where:{datasource:{id:r}},relations:{columns:!0},order:{name:"ASC",columns:{isPrimary:"DESC",name:"ASC"}}})).map(n=>({tableName:n.name,id:n.id,updatedAt:n.updatedAt,createdAt:n.createdAt,columns:n.columns.map(i=>({name:i.name,type:i.type,isPrimary:i.isPrimary,ref:i.meta?.refs}))}))}}})});var U=require("typeorm"),jt=h(e=>{e.route({method:"get",url:"/team/:teamId/datasources",handler:async t=>{let{teamId:r}=f(t);return{data:await I.find({where:{team:{id:r}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0,dbType:!0,description:!0,allowInsert:!0,allowUpdate:!0}})}}}),e.route({method:"get",url:"/team/:teamId/queries",handler:async t=>{let r=f(t),o=_(t),a=r.teamId||t.user.currentTeamId,n=Number(o.size)||20,i=Number(o.page)||0,s=o.nameFilter?.length?{name:(0,U.Raw)(d=>`LOWER(${d}) LIKE :search`,{search:`%${o.nameFilter.toLowerCase()}%`})}:void 0,m=await v.find({where:[{isPersonal:!1,team:{id:a},query:s},{isPersonal:!0,team:{id:a},query:s,user:{id:t.user.id}}],relations:{query:{dataSource:!0}},take:n+1,skip:i*n,select:{id:!0,query:{id:!0,name:!0,updatedAt:!0,dataSource:{name:!0,dbType:!0}}},order:{query:{updatedAt:"DESC"}}}),c=m.length>n;return c&&m.pop(),{data:m.map(d=>({name:d.query.name,id:d.query.id,updatedAt:d.query.updatedAt,savedQueryId:d.id,datasourceName:d.query.dataSource.name,datasourceType:d.query.dataSource.dbType})),hasMore:c}}}),e.route({method:"get",url:"/team/:teamId/count-saved-queries",handler:async t=>{let o=f(t).teamId||t.user.currentTeamId;return{data:await v.count({where:[{isPersonal:!1,team:{id:o}},{isPersonal:!0,team:{id:o},user:{id:t.user.id}}],select:{id:!0}})}}}),e.route({method:"get",url:"/team/:teamId/query",handler:async t=>{let{teamId:r}=f(t),{search:o,size:a,selectedDataSources:n}=_(t),i=o.length>3?parseInt(a)||20:8,s={};n?.length&&(s.id=(0,U.In)(n));let[m,c,l]=await Promise.all([F.find({where:{name:(0,U.Raw)(p=>`LOWER(${p}) LIKE :search`,{search:`%${o.toLowerCase()}%`}),datasource:s},relations:{datasource:!0},select:{id:!0,name:!0,datasource:{name:!0,id:!0}},order:{name:"ASC"},take:i}),A.find({where:{searchString:(0,U.Like)(`%${o.toLowerCase()}%`),team:{id:r},user:{id:t.user.id},dataSource:s},relations:{dataSource:!0},select:{id:!0,name:!0,updatedAt:!0,dataSource:{id:!0,name:!0}},order:{updatedAt:"ASC"},take:i}),v.find({where:{searchString:(0,U.Like)(`%${o.toLowerCase()}%`),team:{id:r},query:{dataSource:s}},relations:{query:{dataSource:!0}},select:{id:!0,updatedAt:!0,query:{id:!0,name:!0,dataSource:{name:!0}}},order:{updatedAt:"ASC"},take:i})]),d=[];return m.forEach(p=>{d.push({name:p.name,id:p.id,dataSourceName:p.datasource?.name||"--",dataSourceId:p.datasource?.id||"--",type:"table"})}),c.forEach(p=>{d.push({name:p.name,id:p.id,dataSourceName:p.dataSource?.name||"--",dataSourceId:p.dataSource?.id||"--",type:"tab"})}),l.forEach(p=>{d.push({name:p.query.name,id:p.query.id,dataSourceName:p.query.dataSource?.name||"--",dataSourceId:p.query.dataSource?.id||"--",type:"query"})}),{data:d}}}),e.route({method:"get",url:"/team/:teamId/tabs-history",handler:async t=>{let{teamId:r}=f(t),o=_(t),a=Number(o.page),n=Number(o.size),i=t.user.id,s={team:{id:r},user:{id:i}};o.nameFilter?.length&&(s.name=(0,U.Like)(`%${o.nameFilter}%`)),o.archived&&(s.archived=o.archived==="true");let m=await A.find({where:s,relations:{dataSource:!0},order:{updatedAt:"DESC"},take:n+1,skip:a*n}),c=!1;return m.length>n&&(m.pop(),c=!0),{data:m.map(l=>({name:l.name,id:l.id,updatedAt:l.updatedAt,archived:l.archived,createdAt:l.createdAt,dataSourceId:l.dataSource?.id,dataSourceName:l.dataSource?.name,dataSourceType:l.dataSource?.dbType})),hasMore:c}}})});var Kt=h(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=f(t),o=await E.findOne({where:{id:r},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return o?{data:o}:{status:404,data:"Query not found"}}}),e.route({method:"post",url:"/",config:{requireRole:S("editor")},handler:async t=>{let r=y(t),o=await I.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await E.save(E.create({name:r.name,opts:r.opts,team:{id:o?.team.id},dataSource:{id:r.dataSourceId},user:{id:t.user.id}}))}}}),e.route({method:"patch",url:"/:id",config:{requireRole:S("editor")},handler:async t=>{let{id:r}=f(t),o=y(t);if(!(await E.update(r,o)).affected)throw new u(404,"Query not found");return{data:await E.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",config:{requireRole:S("editor")},handler:async t=>b.transaction(async()=>{let{id:r}=f(t);if(!(await E.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var Vt=e=>e&&ie(e)?"CONTAINS":"=",ve=(e,t)=>{let r=[];for(let o of e){if(!o.column?.length||!o.value?.length||o.isEnabled===!1)continue;let[a,n]=o.column.split("."),i=t(a,n);if(o.isAdvanced){let s=Wt.parse(o.value);if(!s)throw new u(400,`Invalid value for '${o.column}': ${o.value}`);r.push({value:s.value,column:o.column,operator:s.operator||Vt(i?.type),fn:o.fn})}else r.push({value:o.value?[{value:o.value}]:[],column:o.column,operator:Vt(i?.type),fn:o.fn})}return r},zt=e=>{let t=[e.table];return e.joins&&e.joins.forEach(({table:r})=>t.push(r)),t},xe=e=>({column:e.value,fn:e.fn,distinct:e.distinct}),Jt=(e,t,r)=>{let o=[];return t.length>0||r.length>0?o.push(...t.map(xe),...r.map(xe)):e.length>0&&o.push(...e.map(xe)),o},$o=e=>e.isPrimary&&e.table?.name?{table:e.table.name,field:e.name}:e?.meta?.refs,Ho=e=>e?.meta?.referencedBy,Xt=(e,t,r)=>t.map((o,a)=>{let n=o.table?r(o.table,o.column):void 0,i=n?$o(n):void 0,s=n?Ho(n):void 0;return{...o,full:e[a].fn?e[a].column:o.full,type:n?.type,fn:e[a].fn,ref:i,referencedBy:s}}),Zt=e=>{let t=[],r=[];for(let o of e)o.referencedBy?.forEach(a=>{t.push({id:[a.table,a.field,o.column,o.table].join("."),fromColumn:a.field,fromTable:a.table,toColumn:o.column,toTable:o.table,direction:"in"})}),o.ref&&r.push({id:[o.column,o.table,o.ref.table,o.ref.field].join("."),fromColumn:o.column,fromTable:o.table,toColumn:o.ref.field,toTable:o.ref.table,direction:"out"});return{hooks:t,entities:r}};var _e=require("typeorm"),er=new _e.DataSource({type:"mysql"}),tr=new _e.DataSource({type:"postgres"}),Y=e=>{switch(e){case"postgres":return tr.createQueryBuilder();case"mysql":return er.createQueryBuilder();default:throw new Error("Unsupported database connection")}},ue={postgres:tr.driver,mysql:er.driver};var z=(e,t,r)=>{let{column:o,operator:a,value:n}=e,i="_"+t;switch(a){case"IS NULL":case"IS NOT NULL":return[`${o} ${a}`,{value:void 0}];case"IN":case"NOT IN":return[`${o} ${a} (:...${i})`,{[i]:n?.map(c=>c.value)}];case"LIKE":case"CONTAINS":return[`${o} ${r==="postgres"?"ILIKE":"LIKE"} :${i}`,{[i]:a==="CONTAINS"?`%${n?.[0].value}%`:n?.[0].value}];case"NOT LIKE":case"NOT CONTAINS":return[`${o} ${r==="postgres"?"NOT ILIKE":"NOT LIKE"} :${i}`,{[i]:a==="NOT CONTAINS"?`%${n?.[0].value}%`:n?.[0].value}];default:return[`${o} ${a} :${i}`,{[i]:n?.[0]?.value}]}};var rr=e=>{let t=ue[e];return r=>{if(r.includes(".")){let[o,a]=r.split(".");return t.escape(o)+"."+t.escape(a)}return r==="*"?r:t.escape(r)}};var or=["SUM","COUNT","AVG","MAX","MIN"],Wo=["YEAR","MONTH","DAY",...or],Yo=Wo.reduce((e,t)=>(e[t]=!0,e),{}),Go=or.reduce((e,t)=>(e[t]=!0,e),{}),ar=e=>Yo[e],nr=e=>Go[e];var ce=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,sr={YEAR:e=>`EXTRACT(YEAR FROM ${e})`,MONTH:e=>`EXTRACT(MONTH FROM ${e})`,DAY:e=>`EXTRACT(DAY FROM ${e})`,SUM:(e,t,r)=>r?`COALESCE(SUM(distinct ${e}), 0)`:`COALESCE(SUM(${e}), 0)`,AVG:ce,MAX:ce,MIN:ce,COUNT:ce};var me=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,ir={YEAR:e=>`YEAR(${e})`,MONTH:e=>`MONTH(${e})`,DAY:e=>`DAY(${e})`,SUM:(e,t,r)=>r?`coalesce(${t}(distinct ${e}), 0)`:`coalesce(${t}(${e}), 0)`,AVG:me,MAX:me,MIN:me,COUNT:me};var jo=e=>{let t=[];return e.fn&&t.push(e.fn),e.distinct&&t.push("distinct"),t.push(e.column),t.join(" ")},Ko=e=>{let t=rr(e),r=e==="postgres"?sr:ir;return o=>o.fn&&ar(o.fn)?r[o.fn](t(o.column),o.fn,o.distinct):t(o.column)};function ur(e,t){let r=Y(t.dbType).from(e,e),o=!1,a=0,n=Ko(t.dbType),i={};return{setColumns(s){s.forEach(m=>{let c=jo(m);i[c]=c,r.addSelect(n(m),c)})},setLimit:s=>{r.limit(s),o=!0},setOffset(s){r.offset(s)},addOrderBy(s,m){r.addOrderBy(s,m)},addJoin({table:s,alias:m,on:c}){r.leftJoin(s,m||s,c)},addWhere(s){let[m,c]=z({...s,operator:s.operator||"=",column:n(s)},++a,t.dbType);r.andWhere(m,c)},addHaving(s){let[m,c]=z({...s,operator:s.operator||"=",column:n(s)},++a,t.dbType);r.andHaving(m,c)},addGroupBy(s){r.addGroupBy(n(s))},hasAlias(s){return!!i[s]},build(){o||r.limit(50);let[s,m]=r.getQueryAndParameters();return{sql:s,params:m}}}}var cr=(e,t)=>{let r=Y(t.dbType).update(e),o=0;return{addWhere(a){let[n,i]=z(a,++o,t.dbType);r.andWhere(n,i)},setParams(a){let n={};for(let[i,s]of Object.entries(a)){let m=`${s}`;m.startsWith("=")?n[i]=()=>m.substring(1):n[i]=m}r.set(n)},build(){let[a,n]=r.getQueryAndParameters();return{sql:a,params:n}}}};var mr=(e,t)=>{let r=Y(t.dbType).insert().into(e);return{setValues(o){let a={};for(let[n,i]of Object.entries(o)){let s=`${i}`;s.startsWith("=")?a[n]=()=>s.substring(1):a[n]=s}r.values([a])},build(){let[o,a]=r.getQueryAndParameters();return{sql:o,params:a}}}};var Ue=ur,lr=cr,dr=mr;var pr=require("typeorm"),fr=async(e,t)=>{let r=await q.find({where:{table:{name:(0,pr.In)(t),datasource:{id:e}}},relations:{table:!0},order:{table:{name:"ASC"},isPrimary:"DESC",name:"ASC"}}),o=[];for(let s of r)o.push({column:s.name,table:s.table.name||"",full:`${s.table.name}.${s.name}`,type:s.type});let a=o.reduce((s,m)=>(s[m.full]=m.type,s),{});return{getAllColumns(){return o},hasColumn(s){return!!a[s]||s==="*"},getAvailableJoins:()=>{let s=[],m=new Set(t);for(let c of r)if(c.meta?.referencedBy?.forEach(l=>{m.has(l.table)||s.push({id:[l.table,l.field,c.name,c.table.name].join("."),fromColumn:l.field,fromTable:l.table,toColumn:c.name,toTable:c.table.name,direction:"in"})}),c.meta?.refs){let l=c.meta.refs;m.has(l.table)||s.push({id:[c.name,c.table.name,l.table,l.field].join("."),fromColumn:c.name,fromTable:c.table.name,toColumn:l.field,toTable:l.table,direction:"out"})}return s},getColumnByName:(s,m)=>{for(let c of r)if(c.name===m&&c.table.name===s)return c}}};async function Vo(e,t,r){return E.save(E.create({user:{id:e},team:{id:t},dataSource:{id:r.datasourceId},name:r.name,opts:r.opts}))}var le=async(e,t)=>{let{datasourceId:r,size:o=20,page:a}=t,{table:n,joins:i,groupBy:s,orderBy:m}=t.opts,c=await de(r);if(!c)throw new u(404,"Datasource not found");let l=Jt(t.opts.columns,t.opts.groupBy,t.opts.aggregations),d=zt(t.opts),p=await fr(r,d),N=p.getAllColumns(),L;l&&l.length>0?L=l:L=N.map(C=>({column:C.full})),L.forEach(C=>{if(!p.hasColumn(C.column))throw new u(400,`Invalid column ${C.column}`)});let zr=Vo(e.user.id,e.user.currentTeamId,t),x=Ue(n,c);x.setLimit(o+1),x.setOffset(o*a),x.setColumns(L),i&&i.forEach(x.addJoin),m.length>0&&m.forEach(({column:C,direction:ro})=>{x.hasAlias(C)&&x.addOrderBy(ue[c.dbType].escape(C),ro)}),s&&s.length>0&&s.forEach(C=>{p.hasColumn(C.value)&&x.addGroupBy({column:C.value,fn:C.fn,distinct:C.distinct})}),ve(t.opts.filters,p.getColumnByName).forEach(C=>{C.fn&&nr(C.fn)?x.addHaving(C):x.addWhere(C)});let{sql:Jr,params:Xr}=x.build(),X=await(await B(M(c,!0),c.dbType,e)).executeQuery({sql:Jr,params:Xr,type:"SELECT",allowBulkUpdate:!1}),ke=X.rows.length>o;ke&&X.rows.pop();let{id:Zr}=await zr,qe=Xt(L,X.columns,p.getColumnByName),{hooks:eo,entities:to}=Zt(qe);return{...X,queryHistoryId:Zr,tables:d,allColumns:N,availableHooks:eo,availableEntities:to,availableJoins:p.getAvailableJoins(),columns:qe,hasMore:ke}},yr=async(e,t)=>{let r=await de(t.dataSourceId);if(!r)throw new u(400,"Invalid datasource");let o=await B(M(r,!0),r.dbType,e),a=Ue(t.table,r);a.setLimit(2);for(let[m,c]of Object.entries(t.props))a.addWhere({value:[{value:c}],column:m});let{sql:n,params:i}=a.build(),s=await o.executeQuery({sql:n,params:i,type:"SELECT",allowBulkUpdate:!1});if(s.rows.length>1)throw new u(400,"Found multiple rows for given query");if(s.rows.length<1)throw new u(404,"Entity not found");return{entity:s.rows[0],columns:s.columns,sql:n}},Tr=async(e,t)=>{let r=await de(t.datasourceId);if(!r)throw new u(404,"Data source not found");if(!r.allowUpdate)throw new u(403,"This datasource does not allow update operations");let o=lr(t.table,r);o.setParams(t.values),ve(t.filters,()=>{}).forEach(s=>{o.addWhere(s)});let{sql:a,params:n}=o.build();return(await B(M(r,!0),r.dbType,e)).executeQuery({sql:a,params:n,type:"UPDATE",allowBulkUpdate:!1})},gr=async(e,t)=>{let r=await de(t.datasourceId);if(!r)throw new u(404,"Data source not found");if(!r.allowInsert)throw new u(403,"This datasource does not allow insert operations");let o=dr(t.table,r);o.setValues(t.values);let{sql:a,params:n}=o.build();return(await B(M(r,!0),r.dbType,e)).executeQuery({sql:a,type:"INSERT",params:n,allowBulkUpdate:!1})};async function de(e){return I.findOne({where:{id:e},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowUpdate","allowInsert"]})}var hr=e=>{},zo=["--",";","DROP","drop"],br=([e,t])=>{if(typeof t=="string"&&t.startsWith("=")){let r=t;zo.forEach(o=>{if(r.includes(o))throw new u(400,"Invalid input value for "+e)})}},wr=e=>{if(!e.table)throw new u(400,"Table is required");Object.entries(e.values).forEach(br)},Sr=e=>{if(!e.table)throw new u(400,"Table is required");Object.entries(e.values).forEach(br)};var Ir=h(e=>{e.route({method:"post",url:"/:dsId/select",handler:async t=>{let r=y(t,hr);return{data:await le(t,r)}}}),e.route({method:"get",url:"/:dsId/entity/:table",handler:async t=>{let{dsId:r,table:o}=f(t),a=_(t);return{data:await yr(t,{table:o,dataSourceId:r,props:a})}}}),e.route({method:"post",url:"/:dsId/insert",config:{requireRole:S("editor")},handler:async t=>{let r=y(t,wr);return{data:await gr(t,r)}}}),e.route({method:"post",url:"/:dsId/update",config:{requireRole:S("editor")},handler:async t=>{let r=y(t,Sr);return{data:await Tr(t,r)}}})});var Er=h(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:T.str("SERVER_VERSION")}}))});var Cr=h(e=>{e.route({method:"get",url:"/:id/users",handler:async t=>{let{id:r}=f(t),o=await k.findOne({where:{id:r},relations:{users:{user:!0}}});if(!o)throw new u(404,"Team not found");return{data:o.users.map(a=>({role:a.role,id:a.user.id,name:a.user.username}))}}}),e.route({method:"post",url:"/",config:{requireRole:S("editor")},handler:async t=>b.transaction(async()=>{let r=t.user.id,o=y(t),a=w.create();a.id=r;let n=k.create(o);await k.save(n);let i=R.create({user:a,team:n});return await R.save(i),{data:n}})}),e.route({method:"patch",url:"/:id/user-role",config:{requireRole:S("admin")},handler:async t=>{let{id:r}=f(t),{role:o,userId:a}=y(t,({role:i})=>{if(i==="owner")throw new u(400,"Only one owner is allowed")});if((await R.findOneBy({user:{id:a},team:{id:r}}))?.role==="owner")throw new u(400,"Cannot change owner role");await R.update({user:{id:a},team:{id:r}},{role:o})}}),e.route({method:"delete",url:"/:id",config:{requireRole:S("admin")},handler:async t=>b.transaction(async()=>{let{id:r}=f(t),{userId:o}=_(t);if((await R.findOneBy({user:{id:o},team:{id:r}}))?.role==="owner")throw new u(400,"Cannot delete team owner");await w.update(o,{currentTeam:null}),await R.delete({user:{id:o},team:{id:r}}),await w.delete({id:o})})})});var Le=O(require("bcryptjs")),J=async e=>{let t=await Le.default.genSalt(10);return Le.default.hash(e,t)};var Rr=h(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=await w.findOne({where:{id:t.user.id},relations:{currentTeam:{team:!0}}});if(!r)throw new u(404,"User not found");return{data:{id:r.id,teamId:r.currentTeam?.team.id,teamName:r.currentTeam?.team.name,teamRole:r.currentTeam?.role,username:r.username}}}}),e.route({method:"patch",url:"/",handler:async t=>{let r=t.user.id,o=y(t);if(o.password&&(o.password=await J(o.password)),!(await w.update(r,o)).affected)throw new u(404,"User not found");let n=await w.findOne({where:{id:r},relations:{currentTeam:{team:!0}}});return{data:{id:n?.id,teamId:n?.currentTeam?.team.id,teamName:n?.currentTeam?.team.name,teamRole:n?.currentTeam?.role,username:n?.username}}}}),e.route({method:"post",url:"/",config:{requireRole:S("admin")},handler:async t=>b.transaction(async()=>{let r=y(t),o=await J(r.password),a=await w.save(w.create({username:r.username,password:o})),n=await R.save(R.create({role:"read_only",team:{id:r.teamId},user:{id:a.id}}));await w.update(a.id,{currentTeam:{id:n.id}})})})});var Nr=h(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=t.user.id,o=await H.findOneBy({user:{id:r}});return o||(o=await H.save(H.create({user:{id:r}}))),{data:o}}}),e.route({method:"patch",url:"/",handler:async t=>{let{settings:r}=y(t);if(!r.id)throw new u(400,"Settings id is required!");if(!(await H.update(r.id,r)).affected)throw new u(404,"You do not own these settings!");return{data:await H.findOneBy({id:r.id})}}})});function G(e,...t){let r=[...t];if(e.searchAll&&r.push(e.searchAll),e.filters)for(let o of e.filters)o.value&&r.push(o.value);return r.map(o=>o.toLowerCase()).join(",")}var Ar=h(e=>{e.route({method:"post",url:"/",config:{requireRole:S("editor")},handler:async t=>{let r=y(t),o=await E.findOne({where:{id:r.queryId}});if(!o)throw new u(400,"Query not found");let a=await v.save(v.create({isPersonal:!1,team:{id:t.user.currentTeamId},user:{id:t.user.id},query:{id:r.queryId},searchString:G(o.opts,r.name)}));return await E.update(r.queryId,{name:r.name}),{data:a}}}),e.route({method:"delete",url:"/:id",config:{requireRole:S("editor")},handler:async t=>{let{id:r}=f(t);if(!(await v.delete({id:r})).affected)return{status:404,data:"Query not found"}}}),e.route({method:"patch",url:"/:id",handler:async t=>await b.transaction(async()=>{let{id:r}=f(t),o=y(t,i=>{if(!i.name)throw new u(400,"Name is required")}),a=await v.findOne({where:{id:r},relations:{query:!0}});if(!a)throw new u(400,"Query not found");let n=G(a.query.opts,o.name);return await Promise.all([v.update({id:r},{searchString:n}),E.update({id:a.query.id},{name:o.name})]),{data:!0}})})});var Pr=e=>{if(!e.queryId&&!(e.opts&&e.name))throw new u(400,"Either queryId or name and opts are required")};var Or=h(e=>{e.route({method:"get",url:"/",handler:async t=>{let{currentTeamId:r,id:o}=t.user;return{data:(await A.find({where:{team:{id:r},user:{id:o},archived:!1},select:["id","name"]})).map(n=>({name:n.name,id:n.id}))}}}),e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=f(t),{currentTeamId:o,id:a}=t.user,n=await A.findOne({where:{id:r,team:{id:o},user:{id:a}}});if(!n)throw new u(404,"Not Found");return{data:n}}}),e.route({method:"post",url:"/",handler:async t=>{let{opts:r,name:o,queryId:a}=y(t,Pr),n,i,s=o;if(r)i=r.dataSourceId,n=r;else{let c=await E.findOne({where:{id:a},relations:{dataSource:!0}});if(!c)throw new u(404,"Query not Found");i=c.dataSource.id,n={table:c.opts.table,filters:c.opts.filters,joins:c.opts.joins,orderBy:c.opts.orderBy,columns:c.opts.columns,groupBy:c.opts.groupBy,searchAll:c.opts.searchAll,aggregations:c.opts.aggregations,dataSourceId:c.dataSource.id,page:0,size:50},o||(s=c.name)}return{data:await A.save(A.create({name:s||new Date().toISOString(),opts:n||{},dataSource:{id:i},user:{id:t.user.id},team:{id:t.user.currentTeamId}}))}}}),e.route({method:"post",url:"/:id/run",handler:async t=>{let{id:r}=f(t),o=y(t),a=await A.findOne({where:{id:r},relations:{user:!0}});if(!a)throw new u(404,"Not found");if(a.user?.id!==t.user.id)throw new u(404,"Not found");return o&&A.update(r,{opts:o||{},searchString:G(o,a.name),updatedAt:new Date}),{data:{result:await le(t,{datasourceId:o.dataSourceId,size:o.size,name:a.name,page:o.page,opts:{table:o.table,filters:o.filters,joins:o.joins,orderBy:o.orderBy,columns:o.columns,groupBy:o.groupBy,searchAll:o.searchAll,aggregations:o.aggregations}})}}}}),e.route({method:"patch",url:"/:id",handler:async t=>{let{id:r}=f(t),o=y(t),a=await A.findOne({where:{id:r,user:{id:t.user.id}}});if(!a)throw new u(404,"Not Found");let n=a.searchString;return o.name&&(n=G(a.opts,o.name)),await A.update(r,{...o,searchString:n}),{data:{id:r}}}}),e.route({method:"delete",url:"/:id",handler:async t=>{let{id:r}=f(t),o=t.user.id;return await A.delete({id:r,user:{id:o}}),{data:!0}}})});var vr=require("node:crypto");var Dr=require("node:crypto"),xr={teamName:"Default Team",username:"admin"},Jo=async()=>{let e=await k.findOneBy({});return e||k.save(k.create({name:xr.teamName}))},pe=async e=>{let t=await R.findOne({where:{role:"owner"},relations:{user:!0}});if(t)return t.user;let r=await Jo(),o=await J(e?.password||(0,Dr.randomBytes)(32).toString("hex")),a=await w.save(w.create({username:e?.name||xr.username,password:o})),n=await R.save(R.create({user:a,team:r,role:"owner"}));return await w.update(a.id,{currentTeam:n}),a};var fe={setupAccessToken:void 0},_r=()=>(fe.setupAccessToken=(0,vr.randomBytes)(32).toString("hex"),fe.setupAccessToken),Xo=e=>{if(!fe.setupAccessToken)throw new u(400,"Setup already performed");if(!e||e!==fe.setupAccessToken)throw new u(400,"Invalid setup access token")},$=async()=>D.skipAuth?!1:await w.count()<1,Ur=async e=>{Xo(e.setupAccessToken),await pe({name:e.userName,password:e.userPassword})};var Lr=h(e=>{e.route({method:"get",url:"/client.config.js",handler:(t,r)=>{let o={skipAuth:D.skipAuth,modeName:D.name,usesCustomDb:He(),serverVersion:T.str("SERVER_VERSION","--")};return r.type("application/javascript").send(`window.__CLIENT_CONFIG__ = ${JSON.stringify(o)};`)}}),e.route({method:"get",url:"/",handler:async(t,r)=>await $()?r.redirect("/setup"):r.sendFile("index.html")}),e.route({method:"get",url:"/setup",handler:async(t,r)=>await $()?r.sendFile("setup.html"):r.redirect("/")})});var kr=e=>{if(!e.setupAccessToken)throw new u(400,"Invalid setup access token");if(!e.userPassword||e.userPassword.length<8)throw new u(400,"Password should be at least 8 chars long");if(!e.userName)throw new u(400,"User name is required")};var qr=h(e=>{e.route({method:"post",url:"/",config:{isPublic:!0},handler:async t=>{if(!await $())throw new u(400,"Setup has already been completed");let o=y(t,kr);return await Ur(o),{data:!0}}})});var Zo=[[Lr,"/"],[ft,"/api/auth"],[Gt,"/api/data-sources"],[jt,"/api/project"],[Kt,"/api/queries"],[Ir,"/api/runner"],[Er,"/api/status"],[Cr,"/api/teams"],[Rr,"/api/users"],[Nr,"/api/user-settings"],[Ar,"/api/saved-queries"],[Or,"/api/workbench-tabs"],[qr,"/api/setup"]],Br=e=>{for(let[t,r]of Zo)e.register(t,{prefix:r}),console.log("Registered "+r)};var ea=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),ta=async()=>R.findOne({where:{role:"owner"},relations:{user:!0,team:!0}}),ra=async e=>{let t=await ta();if(!t)throw new u(401,"User is not part of a team");e.user={id:t.user.id,currentTeamId:t.team.id,currentTeamRole:t.role}},oa=async e=>{let t=e.headers.authorization;if(!t)throw new u(401,"Missing auth token");let[r,o]=t.split(" "),{userId:a}=await mt(o),n=await w.findOne({where:{id:a},select:{id:!0,currentTeam:{role:!0,team:{id:!0}}},relations:{currentTeam:{team:!0}}});if(!n)throw new u(401,"Unauthorized");e.user={id:a,currentTeamId:n.currentTeam.team.id,currentTeamRole:n.currentTeam.role}},Mr=async e=>{ea(e)||(D.skipAuth?await ra(e):await oa(e))};var Qr=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Fr=e=>{e.addHook("onRequest",Mr),e.addHook("onRequest",Yt),e.addHook("onResponse",Qr)};var $r=e=>{e.setNotFoundHandler((t,r)=>{if(t.raw.url?.startsWith("/api/")){r.code(404).send({error:"API route not found"});return}r.sendFile("index.html")}),e.setErrorHandler((t,r,o)=>{console.error(t),t instanceof u?o.status(t.status).send({error:t.message}):o.status(500).send({error:"Internal Server Error"})})};var Hr=O(require("@fastify/cookie")),Wr=O(require("@fastify/cors"));var Yr=O(require("@fastify/static")),Gr=require("node:path"),jr=e=>{e.register(Hr.default,{}),e.register(Wr.default,{origin:j.allowedOrigins,methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),e.register(Yr.default,{root:(0,Gr.join)(__dirname,"web")})};(async function(){let t=(0,Kr.default)({querystringParser:o=>Vr.default.parse(o)});if($e(),jr(t),Fr(t),Br(t),$r(t),await t.after(),await ot(),t.listen({port:j.port,host:j.host},(o,a)=>{o&&(console.error(o),process.exit(1)),console.log(`Server listening at ${a}`)}),await $()){let o=_r();console.log(`Setup access token:
58
- ${o}`),console.log("Use the above token to finish the setup process when opening the app for the first time.")}else await pe()})();
57
+ limit 75;`;return(await t.query(r)).rows.reduce((a,n)=>(a[n.row_key]={table:n.relname,column:n.attname},a),{})},wt=async(e,t,r,o)=>{try{console.log(`[PG CONN] Query: ${e}`),console.log(`[PG CONN] Params: ${JSON.stringify(t,null,2)}`);let{rows:a,fields:n,command:i,rowCount:s}=await r.query({text:e,rowMode:"array",values:t});if(i==="UPDATE"||i==="INSERT"||i==="DELETE"){if(s!=null&&s>1&&o.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(i==="SELECT"){let m=n.map(l=>`'${l.tableID}-${l.columnID}'`),c=await No(m,r);return{columns:n.map(l=>{let p=c[`${l.tableID}-${l.columnID}`];return{column:p?.column||l.name,alias:l.name,table:p?.table||"",full:p?p.table+"."+p.column:l.name}}),rows:a,query:e}}throw new Error(`[PG CONN] Unsupported command: ${i}`)}catch(a){throw a instanceof u?a:new u(400,a.message)}},Ao=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}},Po=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}},It=async e=>{let t=await Io(e),r=!1,o=!1,a=async n=>(o||await t.query(`SET search_path TO ${e.schema}`),n());return{dbType:"postgres",dataSource:e,inspectSchema:()=>Ro(e,t),executeQuery:n=>a(()=>n.type==="SELECT"?Po(t,()=>wt(n.sql,n.params,t,n)):Ao(t,()=>wt(n.sql,n.params,t,n))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.end()}}};var F=async(e,t,r)=>{try{let o;if(t==="mysql")o=await bt(e);else if(t==="postgres")o=await It(e);else throw new u(500,`Connection manager for ${t} not found`);return r.__connections?r.__connections.push(o):r.__connections=[o],o}catch(o){throw console.error(o),o instanceof u?o:o?.code==="ECONNREFUSED"?new u(500,"Failed to connect to the database"):new u(500,o.message)}};var ce=O(require("node:crypto"));var Et="aes-256-gcm",Oo=12,Ct=()=>{let e=T.str("SYMM_ENCRYPTION_KEY");if(!e)throw new Error("Missing ENCRYPTION_KEY in environment variables.");let t=Buffer.from(e,"hex");if(t.length!==32)throw new Error("ENCRYPTION_KEY must be a 64-character hex string (256 bits).");return t},Do=e=>{let t=ce.default.randomBytes(Oo),r=Ct(),o=ce.default.createCipheriv(Et,r,t),a=o.update(e,"utf8","hex");a+=o.final("hex");let n=o.getAuthTag();return{encrypted:a,iv:t.toString("hex"),tag:n.toString("hex")}},xo=({encrypted:e,iv:t,tag:r})=>{let o=Ct(),a=ce.default.createDecipheriv(Et,o,Buffer.from(t,"hex"));a.setAuthTag(Buffer.from(r,"hex"));let n=a.update(e,"hex","utf8");return n+=a.final("utf8"),n},me={encrypt:Do,decrypt:xo};var M=(e,t=!1)=>{if(t){let r=me.decrypt({encrypted:e.dbPassword,tag:e.dbPasswordTag,iv:e.dbPasswordIv});return{url:e.dbUrl,user:e.dbUser,database:e.dbDatabase,password:r,port:e.dbPort,schema:e.dbSchema}}return{url:e.dbUrl,user:e.dbUser,database:e.dbDatabase,password:e.dbPassword,port:e.dbPort,schema:e.dbSchema}};var Rt=[{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:"like"},{value:"NOT LIKE",label:"not like"},{value:"CONTAINS",label:"contains"},{value:"NOT CONTAINS",label:"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"}],vo=Rt.reduce((e,t)=>(e[t.value]=t.label,e),{}),us=Rt.reduce((e,t)=>(e[t.label]=t.value,e),{}),Y=e=>e.map(t=>({label:vo[t],value:t})),cs=Y(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),ms=Y(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL","CONTAINS","NOT CONTAINS"]),ls=Y(["=","<>","IS NULL","IS NOT NULL"]),ds=Y(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),ps=Y(["IS NULL","IS NOT NULL"]),fs=Y(["IN","NOT IN"]),_o=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"],Uo=new Set(_o),le=e=>Uo.has(e),Lo=["integer","smallint","decimal","numeric","float","real","double precision","int","smallint","integer","bigint","decimal","numeric","real","double precision","serial","bigserial","money"],ko=new Set(Lo),Nt=e=>ko.has(e);var ys=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var Oe={read_only:10,editor:20,admin:30,owner:40};var P=e=>e.startsWith("'")&&e.endsWith("'")||e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e;var At={operator:"LIKE",parse:e=>{let t=e.match(/^LIKE\s*["'](.*)["']$/i);if(t)return[{value:P(t[1])}]},stringify:e=>`LIKE "%${e[0]?.value}%"`},Pt={operator:"NOT LIKE",parse:e=>{let t=e.match(/^NOT LIKE\s*["'](.*)["']$/i);if(t)return[{value:P(t[1])}]},stringify:e=>`NOT LIKE "%${e[0]?.value}%"`},Ot={operator:"CONTAINS",parse:e=>{let t=e.match(/^CONTAINS\s*["'](.*)["']$/i);if(t)return[{value:P(t[1])}]},stringify:(e,t)=>le(t)?`${e[0]?.value}`:`CONTAINS "%${e[0]?.value}%"`},Dt={operator:"NOT CONTAINS",parse:e=>{let t=e.match(/^NOT CONTAINS\s*["'](.*)["']$/i);if(t)return[{value:P(t[1])}]},stringify:e=>`NOT CONTAINS "%${e[0]?.value}%"`};function vt(e){return e===""?[]:qo(e).map(Bo)}function qo(e){let t=[],r=0,o="",a=!1,n=!1;for(;r<e.length;){let i=e[r];if((a||n)&&i==="\\"){o+=e[r+1],r+=2;continue}if(i==="'"&&!n){a=!a,o+=i,r++;continue}if(i==='"'&&!a){n=!n,o+=i,r++;continue}if(i===","&&!a&&!n){t.push(o.trim()),o="",r++;continue}o+=i,r++}if(o.trim()!==""&&t.push(o.trim()),a||n)throw new Error("Unterminated string literal");return t}function Bo(e){if(e.startsWith("'")&&e.endsWith("'"))return{value:xt(e.slice(1,-1),"'")};if(e.startsWith('"')&&e.endsWith('"'))return{value:xt(e.slice(1,-1),'"')};let t=Number(e);if(!Number.isNaN(t))return{value:t};throw new Error(`Invalid literal: ${e}`)}function xt(e,t){return e.replace(/\\(.)/g,(r,o)=>o)}var _t={operator:"IN",parse:e=>{let t=e.match(/^in\s*\((.*)\)$/i);if(t)return vt(t[1])},stringify:e=>`IN (${e?.map(t=>`"${t.value}"`).join(", ")})`},Ut={operator:"NOT IN",parse:e=>{let t=e.match(/^not\s+in\s*\((.*)\)$/i);if(t)return vt(t[1])},stringify:e=>`NOT IN (${e?.map(t=>`"${t.value}"`).join(", ")})`};var Lt={operator:"=",parse:e=>{let t=e.match(/^=\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:(e,t)=>Nt(t)?`${e[0]?.value}`:`= ${e[0]?.value}`},kt={operator:"!=",parse:e=>{let t=e.match(/^!=\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`!= ${e[0]?.value}`},qt={operator:"<>",parse:e=>{let t=e.match(/^<>\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`<> ${e[0]?.value}`},Bt={operator:">",parse:e=>{let t=e.match(/^>\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`> ${e[0]?.value}`},Qt={operator:">=",parse:e=>{let t=e.match(/^>=\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`>= ${e[0]?.value}`},Ft={operator:"<",parse:e=>{let t=e.match(/^<\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`< ${e[0]?.value}`},Mt={operator:"<=",parse:e=>{let t=e.match(/^<=\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`<= ${e[0]?.value}`};var $t={operator:"IS NULL",parse:e=>{if(/^is\s+null$/i.test(e))return[]},stringify:()=>"IS NULL"},Ht={operator:"IS NOT NULL",parse:e=>{if(/^is\s+not\s+null$/i.test(e))return[]},stringify:()=>"IS NOT NULL"};var Qo=[At,Ot,Pt,Dt,_t,Ut,Lt,kt,qt,Qt,Bt,Mt,Ft,$t,Ht];function Fo(e){let t=e.trim();for(let r of Qo){let o=r.parse(t);if(o)return{operator:r.operator,value:o}}}var Wt={parse:Fo};var S=e=>{let t=Oe[e];return r=>Oe[r.currentTeamRole]>=t},Yt=async e=>{let t=e.routeOptions.config.requireRole;if(t&&!t(e.user))throw new u(403,"You are not authorized to perform this action")};var De=async(e,t)=>{let r=await e.find(B,{where:{datasource:{id:t}},select:["id"]});for(let o of r){let a=await e.find(q,{where:{tableId:o.id},select:["id"]});await e.remove(q,a),await e.delete(B,o)}};function Mo(e){let t=new Map;for(let r of e)r.columns?.forEach(o=>{if(o.ref){let a=`${o.ref.table}.${o.ref.field}`,n=t.get(a)||[];n.push({table:r.tableName,field:o.name}),t.set(a,n)}});return t}var Gt=h(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=f(t),o=await R.findOne({where:{id:r}});if(!o)throw new u(404,"Data source not found");return{data:o}}}),e.route({method:"get",url:"/",handler:async t=>{let{teamId:r}=_(t);return{data:await R.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",config:{requireRole:S("admin")},handler:async t=>{let{teamId:r,ownerId:o,...a}=y(t,yt),n=R.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),i=await F(M(n),n.dbType,t);try{await i.checkConnection()}catch{throw new u(400,"Cannot connect to the database, please check datasource configuration")}let{tag:s,iv:m,encrypted:c}=me.encrypt(n.dbPassword);return n.dbPassword=c,n.dbPasswordIv=m,n.dbPasswordTag=s,{data:await R.save(n)}}}),e.route({method:"put",url:"/:id",config:{requireRole:S("admin")},handler:async t=>{let{id:r}=f(t),o=y(t),a=await R.findOneBy({id:r});if(!a)throw new u(404,"Data source not found");let n=R.merge(a,o);return await R.save(n),{data:n}}}),e.route({method:"delete",url:"/:id",config:{requireRole:S("admin")},handler:async t=>b.transaction(async r=>{let{id:o}=f(t);await Promise.all([De(r,o),r.delete(K,{dataSource:{id:o}})]),await r.delete(k,{id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>b.transaction(async o=>{let{id:a}=f(t),n=await o.findOne(k,{where:{id:a},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]});if(!n)throw new Error("Data source not found");n.status="INSPECTING",await o.save(k,n);let s=await(await F(M(n,!0),n.dbType,t)).inspectSchema();await De(o,n.id);let m=Mo(s);for(let c of s){let l=await o.save(B,{datasource:{id:a},name:c.tableName});if(c.columns){let p=[];for(let d of c.columns)p.push(se.create({table:{id:l.id},name:d.name,isPrimary:!!d.isPrimary,type:d.type,meta:{refs:d.ref,referencedBy:m.get(`${l.name}.${d.name}`)}}));await o.save(q,p)}}n.status="READY",n.lastInspected=new Date,await o.save(k,n)})}),e.route({method:"get",url:"/:id/inspections",handler:async t=>{let{id:r}=f(t);return{data:(await ie.find({where:{datasource:{id:r}},relations:{columns:!0},order:{name:"ASC",columns:{isPrimary:"DESC",name:"ASC"}}})).map(n=>({tableName:n.name,id:n.id,updatedAt:n.updatedAt,createdAt:n.createdAt,columns:n.columns.map(i=>({name:i.name,type:i.type,isPrimary:i.isPrimary,ref:i.meta?.refs}))}))}}})});var U=require("typeorm"),jt=h(e=>{e.route({method:"get",url:"/team/:teamId/datasources",handler:async t=>{let{teamId:r}=f(t);return{data:await R.find({where:{team:{id:r}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0,dbType:!0,description:!0,allowInsert:!0,allowUpdate:!0}})}}}),e.route({method:"get",url:"/team/:teamId/queries",handler:async t=>{let r=f(t),o=_(t),a=r.teamId||t.user.currentTeamId,n=Number(o.size)||20,i=Number(o.page)||0,s=o.nameFilter?.length?{name:(0,U.Raw)(p=>`LOWER(${p}) LIKE :search`,{search:`%${o.nameFilter.toLowerCase()}%`})}:void 0,m=await v.find({where:[{isPersonal:!1,team:{id:a},query:s},{isPersonal:!0,team:{id:a},query:s,user:{id:t.user.id}}],relations:{query:{dataSource:!0}},take:n+1,skip:i*n,select:{id:!0,query:{id:!0,name:!0,updatedAt:!0,dataSource:{name:!0,dbType:!0}}},order:{query:{updatedAt:"DESC"}}}),c=m.length>n;return c&&m.pop(),{data:m.map(p=>({name:p.query.name,id:p.query.id,updatedAt:p.query.updatedAt,savedQueryId:p.id,datasourceName:p.query.dataSource.name,datasourceType:p.query.dataSource.dbType})),hasMore:c}}}),e.route({method:"get",url:"/team/:teamId/count-saved-queries",handler:async t=>{let o=f(t).teamId||t.user.currentTeamId;return{data:await v.count({where:[{isPersonal:!1,team:{id:o}},{isPersonal:!0,team:{id:o},user:{id:t.user.id}}],select:{id:!0}})}}}),e.route({method:"get",url:"/team/:teamId/query",handler:async t=>{let{teamId:r}=f(t),{search:o,size:a,selectedDataSources:n}=_(t),i=o.length>3?parseInt(a)||20:8,s={};n?.length&&(s.id=(0,U.In)(n));let[m,c,l]=await Promise.all([ie.find({where:{name:(0,U.Raw)(d=>`LOWER(${d}) LIKE :search`,{search:`%${o.toLowerCase()}%`}),datasource:s},relations:{datasource:!0},select:{id:!0,name:!0,datasource:{name:!0,id:!0}},order:{name:"ASC"},take:i}),A.find({where:{searchString:(0,U.Like)(`%${o.toLowerCase()}%`),team:{id:r},user:{id:t.user.id},dataSource:s},relations:{dataSource:!0},select:{id:!0,name:!0,updatedAt:!0,dataSource:{id:!0,name:!0}},order:{updatedAt:"ASC"},take:i}),v.find({where:{searchString:(0,U.Like)(`%${o.toLowerCase()}%`),team:{id:r},query:{dataSource:s}},relations:{query:{dataSource:!0}},select:{id:!0,updatedAt:!0,query:{id:!0,name:!0,dataSource:{name:!0}}},order:{updatedAt:"ASC"},take:i})]),p=[];return m.forEach(d=>{p.push({name:d.name,id:d.id,dataSourceName:d.datasource?.name||"--",dataSourceId:d.datasource?.id||"--",type:"table"})}),c.forEach(d=>{p.push({name:d.name,id:d.id,dataSourceName:d.dataSource?.name||"--",dataSourceId:d.dataSource?.id||"--",type:"tab"})}),l.forEach(d=>{p.push({name:d.query.name,id:d.query.id,dataSourceName:d.query.dataSource?.name||"--",dataSourceId:d.query.dataSource?.id||"--",type:"query"})}),{data:p}}}),e.route({method:"get",url:"/team/:teamId/tabs-history",handler:async t=>{let{teamId:r}=f(t),o=_(t),a=Number(o.page),n=Number(o.size),i=t.user.id,s={team:{id:r},user:{id:i}};o.nameFilter?.length&&(s.name=(0,U.Like)(`%${o.nameFilter}%`)),o.archived&&(s.archived=o.archived==="true");let m=await A.find({where:s,relations:{dataSource:!0},order:{updatedAt:"DESC"},take:n+1,skip:a*n}),c=!1;return m.length>n&&(m.pop(),c=!0),{data:m.map(l=>({name:l.name,id:l.id,updatedAt:l.updatedAt,archived:l.archived,createdAt:l.createdAt,dataSourceId:l.dataSource?.id,dataSourceName:l.dataSource?.name,dataSourceType:l.dataSource?.dbType})),hasMore:c}}})});var Kt=h(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=f(t),o=await C.findOne({where:{id:r},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return o?{data:o}:{status:404,data:"Query not found"}}}),e.route({method:"post",url:"/",config:{requireRole:S("editor")},handler:async t=>{let r=y(t),o=await R.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await C.save(C.create({name:r.name,opts:r.opts,team:{id:o?.team.id},dataSource:{id:r.dataSourceId},user:{id:t.user.id}}))}}}),e.route({method:"patch",url:"/:id",config:{requireRole:S("editor")},handler:async t=>{let{id:r}=f(t),o=y(t);if(!(await C.update(r,o)).affected)throw new u(404,"Query not found");return{data:await C.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",config:{requireRole:S("editor")},handler:async t=>b.transaction(async()=>{let{id:r}=f(t);if(!(await C.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var Vt=e=>e&&le(e)?"CONTAINS":"=",ve=(e,t)=>{let r=[];for(let o of e){if(!o.column?.length||!o.value?.length||o.isEnabled===!1)continue;let[a,n]=o.column.split("."),i=t(a,n);if(o.isAdvanced){let s=Wt.parse(o.value);if(!s)throw new u(400,`Invalid value for '${o.column}': ${o.value}`);r.push({value:s.value,column:o.column,operator:s.operator||Vt(i?.type),fn:o.fn})}else r.push({value:o.value?[{value:o.value}]:[],column:o.column,operator:Vt(i?.type),fn:o.fn})}return r},zt=e=>{let t=[e.table];return e.joins&&e.joins.forEach(({table:r})=>t.push(r)),t},xe=e=>({column:e.value,fn:e.fn,distinct:e.distinct}),Jt=(e,t,r)=>{let o=[];return t.length>0||r.length>0?o.push(...t.map(xe),...r.map(xe)):e.length>0&&o.push(...e.map(xe)),o},$o=e=>e.isPrimary&&e.table?.name?{table:e.table.name,field:e.name}:e?.meta?.refs,Ho=e=>e?.meta?.referencedBy,Xt=(e,t,r)=>t.map((o,a)=>{let n=o.table?r(o.table,o.column):void 0,i=n?$o(n):void 0,s=n?Ho(n):void 0;return{...o,full:e[a].fn?e[a].column:o.full,type:n?.type,fn:e[a].fn,ref:i,referencedBy:s}}),Zt=e=>{let t=[],r=[];for(let o of e)o.referencedBy?.forEach(a=>{t.push({id:[a.table,a.field,o.column,o.table].join("."),fromColumn:a.field,fromTable:a.table,toColumn:o.column,toTable:o.table,direction:"in"})}),o.ref&&r.push({id:[o.column,o.table,o.ref.table,o.ref.field].join("."),fromColumn:o.column,fromTable:o.table,toColumn:o.ref.field,toTable:o.ref.table,direction:"out"});return{hooks:t,entities:r}};var _e=require("typeorm"),er=new _e.DataSource({type:"mysql"}),tr=new _e.DataSource({type:"postgres"}),G=e=>{switch(e){case"postgres":return tr.createQueryBuilder();case"mysql":return er.createQueryBuilder();default:throw new Error("Unsupported database connection")}},de={postgres:tr.driver,mysql:er.driver};var X=(e,t,r)=>{let{column:o,operator:a,value:n}=e,i="_"+t;switch(a){case"IS NULL":case"IS NOT NULL":return[`${o} ${a}`,{value:void 0}];case"IN":case"NOT IN":return[`${o} ${a} (:...${i})`,{[i]:n?.map(c=>c.value)}];case"LIKE":case"CONTAINS":return[`${o} ${r==="postgres"?"ILIKE":"LIKE"} :${i}`,{[i]:a==="CONTAINS"?`%${n?.[0].value}%`:n?.[0].value}];case"NOT LIKE":case"NOT CONTAINS":return[`${o} ${r==="postgres"?"NOT ILIKE":"NOT LIKE"} :${i}`,{[i]:a==="NOT CONTAINS"?`%${n?.[0].value}%`:n?.[0].value}];default:return[`${o} ${a} :${i}`,{[i]:n?.[0]?.value}]}};var rr=e=>{let t=de[e];return r=>{if(r.includes(".")){let[o,a]=r.split(".");return t.escape(o)+"."+t.escape(a)}return r==="*"?r:t.escape(r)}};var or=["SUM","COUNT","AVG","MAX","MIN"],Wo=["YEAR","MONTH","DAY",...or],Yo=Wo.reduce((e,t)=>(e[t]=!0,e),{}),Go=or.reduce((e,t)=>(e[t]=!0,e),{}),ar=e=>Yo[e],nr=e=>Go[e];var pe=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,sr={YEAR:e=>`EXTRACT(YEAR FROM ${e})`,MONTH:e=>`EXTRACT(MONTH FROM ${e})`,DAY:e=>`EXTRACT(DAY FROM ${e})`,SUM:(e,t,r)=>r?`COALESCE(SUM(distinct ${e}), 0)`:`COALESCE(SUM(${e}), 0)`,AVG:pe,MAX:pe,MIN:pe,COUNT:pe};var fe=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,ir={YEAR:e=>`YEAR(${e})`,MONTH:e=>`MONTH(${e})`,DAY:e=>`DAY(${e})`,SUM:(e,t,r)=>r?`coalesce(${t}(distinct ${e}), 0)`:`coalesce(${t}(${e}), 0)`,AVG:fe,MAX:fe,MIN:fe,COUNT:fe};var jo=e=>{let t=[];return e.fn&&t.push(e.fn),e.distinct&&t.push("distinct"),t.push(e.column),t.join(" ")},Ko=e=>{let t=rr(e),r=e==="postgres"?sr:ir;return o=>o.fn&&ar(o.fn)?r[o.fn](t(o.column),o.fn,o.distinct):t(o.column)};function ur(e,t){let r=G(t.dbType).from(e,e),o=!1,a=0,n=Ko(t.dbType),i={};return{setColumns(s){s.forEach(m=>{let c=jo(m);i[c]=c,r.addSelect(n(m),c)})},setLimit:s=>{r.limit(s),o=!0},setOffset(s){r.offset(s)},addOrderBy(s,m){r.addOrderBy(s,m)},addJoin({table:s,alias:m,on:c}){r.leftJoin(s,m||s,c)},addWhere(s){let[m,c]=X({...s,operator:s.operator||"=",column:n(s)},++a,t.dbType);r.andWhere(m,c)},addHaving(s){let[m,c]=X({...s,operator:s.operator||"=",column:n(s)},++a,t.dbType);r.andHaving(m,c)},addGroupBy(s){r.addGroupBy(n(s))},hasAlias(s){return!!i[s]},build(){o||r.limit(50);let[s,m]=r.getQueryAndParameters();return{sql:s,params:m}}}}var cr=(e,t)=>{let r=G(t.dbType).update(e),o=0;return{addWhere(a){let[n,i]=X(a,++o,t.dbType);r.andWhere(n,i)},setParams(a){let n={};for(let[i,s]of Object.entries(a)){let m=`${s}`;m.startsWith("=")?n[i]=()=>m.substring(1):n[i]=m}r.set(n)},build(){let[a,n]=r.getQueryAndParameters();return{sql:a,params:n}}}};var mr=(e,t)=>{let r=G(t.dbType).insert().into(e);return{setValues(o){let a={};for(let[n,i]of Object.entries(o)){let s=`${i}`;s.startsWith("=")?a[n]=()=>s.substring(1):a[n]=s}r.values([a])},build(){let[o,a]=r.getQueryAndParameters();return{sql:o,params:a}}}};var Ue=ur,lr=cr,dr=mr;var pr=require("typeorm"),fr=async(e,t)=>{let r=await se.find({where:{table:{name:(0,pr.In)(t),datasource:{id:e}}},relations:{table:!0},order:{table:{name:"ASC"},isPrimary:"DESC",name:"ASC"}}),o=[];for(let s of r)o.push({column:s.name,table:s.table.name||"",full:`${s.table.name}.${s.name}`,type:s.type});let a=o.reduce((s,m)=>(s[m.full]=m.type,s),{});return{getAllColumns(){return o},hasColumn(s){return!!a[s]||s==="*"},getAvailableJoins:()=>{let s=[],m=new Set(t);for(let c of r)if(c.meta?.referencedBy?.forEach(l=>{m.has(l.table)||s.push({id:[l.table,l.field,c.name,c.table.name].join("."),fromColumn:l.field,fromTable:l.table,toColumn:c.name,toTable:c.table.name,direction:"in"})}),c.meta?.refs){let l=c.meta.refs;m.has(l.table)||s.push({id:[c.name,c.table.name,l.table,l.field].join("."),fromColumn:c.name,fromTable:c.table.name,toColumn:l.field,toTable:l.table,direction:"out"})}return s},getColumnByName:(s,m)=>{for(let c of r)if(c.name===m&&c.table.name===s)return c}}};async function Vo(e,t,r){return C.save(C.create({user:{id:e},team:{id:t},dataSource:{id:r.datasourceId},name:r.name,opts:r.opts}))}var ye=async(e,t)=>{let{datasourceId:r,size:o=20,page:a}=t,{table:n,joins:i,groupBy:s,orderBy:m}=t.opts,c=await Te(r);if(!c)throw new u(404,"Datasource not found");let l=Jt(t.opts.columns,t.opts.groupBy,t.opts.aggregations),p=zt(t.opts),d=await fr(r,p),N=d.getAllColumns(),L;l&&l.length>0?L=l:L=N.map(I=>({column:I.full})),L.forEach(I=>{if(!d.hasColumn(I.column))throw new u(400,`Invalid column ${I.column}`)});let zr=Vo(e.user.id,e.user.currentTeamId,t),x=Ue(n,c);x.setLimit(o+1),x.setOffset(o*a),x.setColumns(L),i&&i.forEach(x.addJoin),m.length>0&&m.forEach(({column:I,direction:ro})=>{x.hasAlias(I)&&x.addOrderBy(de[c.dbType].escape(I),ro)}),s&&s.length>0&&s.forEach(I=>{d.hasColumn(I.value)&&x.addGroupBy({column:I.value,fn:I.fn,distinct:I.distinct})}),ve(t.opts.filters,d.getColumnByName).forEach(I=>{I.fn&&nr(I.fn)?x.addHaving(I):x.addWhere(I)});let{sql:Jr,params:Xr}=x.build(),ee=await(await F(M(c,!0),c.dbType,e)).executeQuery({sql:Jr,params:Xr,type:"SELECT",allowBulkUpdate:!1}),ke=ee.rows.length>o;ke&&ee.rows.pop();let{id:Zr}=await zr,qe=Xt(L,ee.columns,d.getColumnByName),{hooks:eo,entities:to}=Zt(qe);return{...ee,queryHistoryId:Zr,tables:p,allColumns:N,availableHooks:eo,availableEntities:to,availableJoins:d.getAvailableJoins(),columns:qe,hasMore:ke}},yr=async(e,t)=>{let r=await Te(t.dataSourceId);if(!r)throw new u(400,"Invalid datasource");let o=await F(M(r,!0),r.dbType,e),a=Ue(t.table,r);a.setLimit(2);for(let[m,c]of Object.entries(t.props))a.addWhere({value:[{value:c}],column:m});let{sql:n,params:i}=a.build(),s=await o.executeQuery({sql:n,params:i,type:"SELECT",allowBulkUpdate:!1});if(s.rows.length>1)throw new u(400,"Found multiple rows for given query");if(s.rows.length<1)throw new u(404,"Entity not found");return{entity:s.rows[0],columns:s.columns,sql:n}},Tr=async(e,t)=>{let r=await Te(t.datasourceId);if(!r)throw new u(404,"Data source not found");if(!r.allowUpdate)throw new u(403,"This datasource does not allow update operations");let o=lr(t.table,r);o.setParams(t.values),ve(t.filters,()=>{}).forEach(s=>{o.addWhere(s)});let{sql:a,params:n}=o.build();return(await F(M(r,!0),r.dbType,e)).executeQuery({sql:a,params:n,type:"UPDATE",allowBulkUpdate:!1})},gr=async(e,t)=>{let r=await Te(t.datasourceId);if(!r)throw new u(404,"Data source not found");if(!r.allowInsert)throw new u(403,"This datasource does not allow insert operations");let o=dr(t.table,r);o.setValues(t.values);let{sql:a,params:n}=o.build();return(await F(M(r,!0),r.dbType,e)).executeQuery({sql:a,type:"INSERT",params:n,allowBulkUpdate:!1})};async function Te(e){return R.findOne({where:{id:e},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowUpdate","allowInsert"]})}var hr=e=>{},zo=["--",";","DROP","drop"],br=([e,t])=>{if(typeof t=="string"&&t.startsWith("=")){let r=t;zo.forEach(o=>{if(r.includes(o))throw new u(400,"Invalid input value for "+e)})}},wr=e=>{if(!e.table)throw new u(400,"Table is required");Object.entries(e.values).forEach(br)},Sr=e=>{if(!e.table)throw new u(400,"Table is required");Object.entries(e.values).forEach(br)};var Ir=h(e=>{e.route({method:"post",url:"/:dsId/select",handler:async t=>{let r=y(t,hr);return{data:await ye(t,r)}}}),e.route({method:"get",url:"/:dsId/entity/:table",handler:async t=>{let{dsId:r,table:o}=f(t),a=_(t);return{data:await yr(t,{table:o,dataSourceId:r,props:a})}}}),e.route({method:"post",url:"/:dsId/insert",config:{requireRole:S("editor")},handler:async t=>{let r=y(t,wr);return{data:await gr(t,r)}}}),e.route({method:"post",url:"/:dsId/update",config:{requireRole:S("editor")},handler:async t=>{let r=y(t,Sr);return{data:await Tr(t,r)}}})});var Er=h(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:T.str("SERVER_VERSION")}}))});var Cr=h(e=>{e.route({method:"get",url:"/:id/users",handler:async t=>{let{id:r}=f(t),o=await Q.findOne({where:{id:r},relations:{users:{user:!0}}});if(!o)throw new u(404,"Team not found");return{data:o.users.map(a=>({role:a.role,id:a.user.id,name:a.user.username}))}}}),e.route({method:"post",url:"/",config:{requireRole:S("editor")},handler:async t=>b.transaction(async()=>{let r=t.user.id,o=y(t),a=w.create();a.id=r;let n=Q.create(o);await Q.save(n);let i=E.create({user:a,team:n});return await E.save(i),{data:n}})}),e.route({method:"patch",url:"/:id/user-role",config:{requireRole:S("admin")},handler:async t=>{let{id:r}=f(t),{role:o,userId:a}=y(t,({role:i})=>{if(i==="owner")throw new u(400,"Only one owner is allowed")});if((await E.findOneBy({user:{id:a},team:{id:r}}))?.role==="owner")throw new u(400,"Cannot change owner role");await E.update({user:{id:a},team:{id:r}},{role:o})}}),e.route({method:"delete",url:"/:id",config:{requireRole:S("admin")},handler:async t=>b.transaction(async()=>{let{id:r}=f(t),{userId:o}=_(t);if((await E.findOneBy({user:{id:o},team:{id:r}}))?.role==="owner")throw new u(400,"Cannot delete team owner");await w.update(o,{currentTeam:null}),await E.delete({user:{id:o},team:{id:r}}),await w.delete({id:o})})})});var Le=O(require("bcryptjs")),Z=async e=>{let t=await Le.default.genSalt(10);return Le.default.hash(e,t)};var Rr=h(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=await w.findOne({where:{id:t.user.id},relations:{currentTeam:{team:!0}}});if(!r)throw new u(404,"User not found");return{data:{id:r.id,teamId:r.currentTeam?.team.id,teamName:r.currentTeam?.team.name,teamRole:r.currentTeam?.role,username:r.username}}}}),e.route({method:"patch",url:"/",handler:async t=>{let r=t.user.id,o=y(t);if(o.password&&(o.password=await Z(o.password)),!(await w.update(r,o)).affected)throw new u(404,"User not found");let n=await w.findOne({where:{id:r},relations:{currentTeam:{team:!0}}});return{data:{id:n?.id,teamId:n?.currentTeam?.team.id,teamName:n?.currentTeam?.team.name,teamRole:n?.currentTeam?.role,username:n?.username}}}}),e.route({method:"post",url:"/",config:{requireRole:S("admin")},handler:async t=>b.transaction(async()=>{let r=y(t),o=await Z(r.password),a=await w.save(w.create({username:r.username,password:o})),n=await E.save(E.create({role:"read_only",team:{id:r.teamId},user:{id:a.id}}));await w.update(a.id,{currentTeam:{id:n.id}})})})});var Nr=h(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=t.user.id,o=await W.findOneBy({user:{id:r}});return o||(o=await W.save(W.create({user:{id:r}}))),{data:o}}}),e.route({method:"patch",url:"/",handler:async t=>{let{settings:r}=y(t);if(!r.id)throw new u(400,"Settings id is required!");if(!(await W.update(r.id,r)).affected)throw new u(404,"You do not own these settings!");return{data:await W.findOneBy({id:r.id})}}})});function j(e,...t){let r=[...t];if(e.searchAll&&r.push(e.searchAll),e.filters)for(let o of e.filters)o.value&&r.push(o.value);return r.map(o=>o.toLowerCase()).join(",")}var Ar=h(e=>{e.route({method:"post",url:"/",config:{requireRole:S("editor")},handler:async t=>{let r=y(t),o=await C.findOne({where:{id:r.queryId}});if(!o)throw new u(400,"Query not found");let a=await v.save(v.create({isPersonal:!1,team:{id:t.user.currentTeamId},user:{id:t.user.id},query:{id:r.queryId},searchString:j(o.opts,r.name)}));return await C.update(r.queryId,{name:r.name}),{data:a}}}),e.route({method:"delete",url:"/:id",config:{requireRole:S("editor")},handler:async t=>{let{id:r}=f(t);if(!(await v.delete({id:r})).affected)return{status:404,data:"Query not found"}}}),e.route({method:"patch",url:"/:id",handler:async t=>await b.transaction(async()=>{let{id:r}=f(t),o=y(t,i=>{if(!i.name)throw new u(400,"Name is required")}),a=await v.findOne({where:{id:r},relations:{query:!0}});if(!a)throw new u(400,"Query not found");let n=j(a.query.opts,o.name);return await Promise.all([v.update({id:r},{searchString:n}),C.update({id:a.query.id},{name:o.name})]),{data:!0}})})});var Pr=e=>{if(!e.queryId&&!(e.opts&&e.name))throw new u(400,"Either queryId or name and opts are required")};var Or=h(e=>{e.route({method:"get",url:"/",handler:async t=>{let{currentTeamId:r,id:o}=t.user;return{data:(await A.find({where:{team:{id:r},user:{id:o},archived:!1},select:["id","name"]})).map(n=>({name:n.name,id:n.id}))}}}),e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=f(t),{currentTeamId:o,id:a}=t.user,n=await A.findOne({where:{id:r,team:{id:o},user:{id:a}}});if(!n)throw new u(404,"Not Found");return{data:n}}}),e.route({method:"post",url:"/",handler:async t=>{let{opts:r,name:o,queryId:a}=y(t,Pr),n,i,s=o;if(r)i=r.dataSourceId,n=r;else{let c=await C.findOne({where:{id:a},relations:{dataSource:!0}});if(!c)throw new u(404,"Query not Found");i=c.dataSource.id,n={table:c.opts.table,filters:c.opts.filters,joins:c.opts.joins,orderBy:c.opts.orderBy,columns:c.opts.columns,groupBy:c.opts.groupBy,searchAll:c.opts.searchAll,aggregations:c.opts.aggregations,dataSourceId:c.dataSource.id,page:0,size:50},o||(s=c.name)}return{data:await A.save(A.create({name:s||new Date().toISOString(),opts:n||{},dataSource:{id:i},user:{id:t.user.id},team:{id:t.user.currentTeamId}}))}}}),e.route({method:"post",url:"/:id/run",handler:async t=>{let{id:r}=f(t),o=y(t),a=await A.findOne({where:{id:r},relations:{user:!0}});if(!a)throw new u(404,"Not found");if(a.user?.id!==t.user.id)throw new u(404,"Not found");return o&&A.update(r,{opts:o||{},searchString:j(o,a.name),updatedAt:new Date}),{data:{result:await ye(t,{datasourceId:o.dataSourceId,size:o.size,name:a.name,page:o.page,opts:{table:o.table,filters:o.filters,joins:o.joins,orderBy:o.orderBy,columns:o.columns,groupBy:o.groupBy,searchAll:o.searchAll,aggregations:o.aggregations}})}}}}),e.route({method:"patch",url:"/:id",handler:async t=>{let{id:r}=f(t),o=y(t),a=await A.findOne({where:{id:r,user:{id:t.user.id}}});if(!a)throw new u(404,"Not Found");let n=a.searchString;return o.name&&(n=j(a.opts,o.name)),await A.update(r,{...o,searchString:n}),{data:{id:r}}}}),e.route({method:"delete",url:"/:id",handler:async t=>{let{id:r}=f(t),o=t.user.id;return await A.delete({id:r,user:{id:o}}),{data:!0}}})});var vr=require("node:crypto");var Dr=require("node:crypto"),xr={teamName:"Default Team",username:"admin"},Jo=async()=>{let e=await Q.findOneBy({});return e||Q.save(Q.create({name:xr.teamName}))},ge=async e=>{let t=await E.findOne({where:{role:"owner"},relations:{user:!0}});if(t)return t.user;let r=await Jo(),o=await Z(e?.password||(0,Dr.randomBytes)(32).toString("hex")),a=await w.save(w.create({username:e?.name||xr.username,password:o})),n=await E.save(E.create({user:a,team:r,role:"owner"}));return await w.update(a.id,{currentTeam:n}),a};var he={setupAccessToken:void 0},_r=()=>(he.setupAccessToken=(0,vr.randomBytes)(32).toString("hex"),he.setupAccessToken),Xo=e=>{if(!he.setupAccessToken)throw new u(400,"Setup already performed");if(!e||e!==he.setupAccessToken)throw new u(400,"Invalid setup access token")},H=async()=>D.skipAuth?!1:await w.count()<1,Ur=async e=>{Xo(e.setupAccessToken),await ge({name:e.userName,password:e.userPassword})};var Lr=h(e=>{e.route({method:"get",url:"/client.config.js",handler:(t,r)=>{let o={skipAuth:D.skipAuth,modeName:D.name,usesCustomDb:He(),serverVersion:T.str("SERVER_VERSION","--")};return r.type("application/javascript").send(`window.__CLIENT_CONFIG__ = ${JSON.stringify(o)};`)}}),e.route({method:"get",url:"/",handler:async(t,r)=>await H()?r.redirect("/setup"):r.sendFile("index.html")}),e.route({method:"get",url:"/setup",handler:async(t,r)=>await H()?r.sendFile("setup.html"):r.redirect("/")})});var kr=e=>{if(!e.setupAccessToken)throw new u(400,"Invalid setup access token");if(!e.userPassword||e.userPassword.length<8)throw new u(400,"Password should be at least 8 chars long");if(!e.userName)throw new u(400,"User name is required")};var qr=h(e=>{e.route({method:"post",url:"/",config:{isPublic:!0},handler:async t=>{if(!await H())throw new u(400,"Setup has already been completed");let o=y(t,kr);return await Ur(o),{data:!0}}})});var Zo=[[Lr,"/"],[ft,"/api/auth"],[Gt,"/api/data-sources"],[jt,"/api/project"],[Kt,"/api/queries"],[Ir,"/api/runner"],[Er,"/api/status"],[Cr,"/api/teams"],[Rr,"/api/users"],[Nr,"/api/user-settings"],[Ar,"/api/saved-queries"],[Or,"/api/workbench-tabs"],[qr,"/api/setup"]],Br=e=>{for(let[t,r]of Zo)e.register(t,{prefix:r}),console.log("Registered "+r)};var ea=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),ta=async()=>E.findOne({where:{role:"owner"},relations:{user:!0,team:!0}}),ra=async e=>{let t=await ta();if(!t)throw new u(401,"User is not part of a team");e.user={id:t.user.id,currentTeamId:t.team.id,currentTeamRole:t.role}},oa=async e=>{let t=e.headers.authorization;if(!t)throw new u(401,"Missing auth token");let[r,o]=t.split(" "),{userId:a}=await mt(o),n=await w.findOne({where:{id:a},select:{id:!0,currentTeam:{role:!0,team:{id:!0}}},relations:{currentTeam:{team:!0}}});if(!n)throw new u(401,"Unauthorized");e.user={id:a,currentTeamId:n.currentTeam.team.id,currentTeamRole:n.currentTeam.role}},Qr=async e=>{ea(e)||(D.skipAuth?await ra(e):await oa(e))};var Fr=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Mr=e=>{e.addHook("onRequest",Qr),e.addHook("onRequest",Yt),e.addHook("onResponse",Fr)};var $r=e=>{e.setNotFoundHandler((t,r)=>{if(t.raw.url?.startsWith("/api/")){r.code(404).send({error:"API route not found"});return}r.sendFile("index.html")}),e.setErrorHandler((t,r,o)=>{console.error(t),t instanceof u?o.status(t.status).send({error:t.message}):o.status(500).send({error:"Internal Server Error"})})};var Hr=O(require("@fastify/cookie")),Wr=O(require("@fastify/cors"));var Yr=O(require("@fastify/static")),Gr=require("node:path"),jr=e=>{e.register(Hr.default,{}),e.register(Wr.default,{origin:V.allowedOrigins,methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),e.register(Yr.default,{root:(0,Gr.join)(__dirname,"web")})};(async function(){let t=(0,Kr.default)({querystringParser:o=>Vr.default.parse(o)});if($e(),jr(t),Mr(t),Br(t),$r(t),await t.after(),await ot(),t.listen({port:V.port,host:V.host},(o,a)=>{o&&(console.error(o),process.exit(1)),console.log(`Server listening at ${a}`)}),await H()){let o=_r();console.log(`Setup access token:
58
+ ${o}`),console.log("Use the above token to finish the setup process when opening the app for the first time.")}else await ge()})();
package/dist/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@dataramen/server","version":"0.0.98","license":"MIT","main":"code/server.js","dependencies":{"@fastify/cors":"^11.0.1","@fastify/static":"^8.2.0","@fastify/cookie":"^11.0.2","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.27","bcryptjs":"^3.0.2","jose":"^6.0.12","reflect-metadata":"^0.2.2","qs":"^6.14.0"},"buildToken":"b54a5b72768539793ced","devDependencies":{"fs-extra":"^11.3.0","open":"^10.2.0","commander":"^14.0.2","yocto-spinner":"^1.0.0"}}
1
+ {"name":"@dataramen/server","version":"0.0.99","license":"MIT","main":"code/server.js","dependencies":{"@fastify/cors":"^11.0.1","@fastify/static":"^8.2.0","@fastify/cookie":"^11.0.2","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.27","bcryptjs":"^3.0.2","jose":"^6.0.12","reflect-metadata":"^0.2.2","qs":"^6.14.0"},"buildToken":"2d92748eeb020f93e7f1","devDependencies":{"fs-extra":"^11.3.0","open":"^10.2.0","commander":"^14.0.2","yocto-spinner":"^1.0.0"}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dataramen/cli",
3
- "version": "0.0.74",
3
+ "version": "0.0.75-beta.1",
4
4
  "repository": "https://github.com/OleksandrDemian/dataramen.git",
5
5
  "author": "Oleksandr Demian <oleksandrovsky@gmail.com>",
6
6
  "license": "MIT",