@dataramen/cli 0.0.75-beta.3 → 0.0.76-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.
- package/dist/code/server.js +7 -7
- package/dist/code/web/assets/main-BjjR8SfP.css +1 -0
- package/dist/code/web/assets/{main-BHhqKULu.js → main-DKrfRG9h.js} +3 -3
- package/dist/code/web/index.html +2 -2
- package/dist/package.json +1 -1
- package/package.json +1 -1
- package/dist/code/web/assets/main-Dah6FOvO.css +0 -1
package/dist/code/server.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
"use strict";var no=Object.create;var Fe=Object.defineProperty;var so=Object.getOwnPropertyDescriptor;var io=Object.getOwnPropertyNames;var uo=Object.getPrototypeOf,co=Object.prototype.hasOwnProperty;var mo=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of io(t))!co.call(e,a)&&a!==r&&Fe(e,a,{get:()=>t[a],enumerable:!(o=so(t,a))||o.enumerable});return e};var P=(e,t,r)=>(r=e!=null?no(uo(e)):{},mo(t||!e||!e.__esModule?Fe(r,"default",{value:e,enumerable:!0}):r,e));var oe=require("dotenv"),ae=require("node:path"),$e=require("node:fs");var te=e=>{function t(a,n=void 0){return e[a]||n}function r(a,n=void 0){let u=e[a];if(!u)return n;let s=Number(u);return!isNaN(s)&&u.trim()!==""?s:n}function o(a){return e[a]==="true"||e[a]==="TRUE"||e[a]==="1"}return{str:t,num:r,bool:o}};function lo(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(lo(process.argv.slice(2)));var po=(()=>{try{let e=(0,$e.readFileSync)((0,ae.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})(),He=[],Me=re.str("env");Me&&He.push((0,ae.resolve)(Me));(0,oe.config)({path:He});var we={APP_DB_TYPE:"sqlite",APP_DB_DATABASE:"<home>/.dataramen/.runtime/db.sqlite3"};(0,oe.populate)(process.env,{SERVER_VERSION:po.version,PROD:"true",...we},{override:!1});var fo=["SYMM_ENCRYPTION_KEY","JWT_SECRET","JWT_REFRESH_SECRET"],We=()=>{let e=[];for(let t of fo)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),Ye=()=>T.str("APP_DB_TYPE")!==we.APP_DB_TYPE&&T.str("APP_DB_DATABASE")!==we.APP_DB_DATABASE;var Dm=require("reflect-metadata"),zr=P(require("fastify")),Jr=P(require("qs"));var rt=require("typeorm");var Ge=require("typeorm");var yo={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"}},To=re.str("mode","default"),D=yo[To];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 Se=new Ge.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 je=require("typeorm");var Ee=new je.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 Ke=require("typeorm");var Ie=new Ke.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 Ve=require("typeorm");var M=new Ve.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 ot=P(require("node:os")),at=require("node:path");var ze=require("typeorm");var K=new ze.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 Je=require("typeorm"),Ce=new Je.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 Xe=require("typeorm");var Re=new Xe.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 Ze=require("typeorm");var Ne=new Ze.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 et=require("typeorm");var q=new et.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 tt=require("typeorm");var B=new tt.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 go(){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>",ot.default.homedir())),e}var b=new rt.DataSource({type:T.str("APP_DB_TYPE"),database:go(),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:[at.posix.join(__dirname,"migrations","*.js")],entities:[M,Se,Ee,Ce,Ie,K,Re,Ne,B,q]}),nt=async()=>{if(!b.isInitialized)return b.initialize();throw new Error("Already initialized")},E=b.getRepository(M),Q=b.getRepository(Se),w=b.getRepository(Ee),C=b.getRepository(Ce),W=b.getRepository(Ie),R=b.getRepository(K),_=b.getRepository(Re),A=b.getRepository(Ne),se=b.getRepository(q),ie=b.getRepository(B);var st=T.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),it=T.num("PORT",4466),V={port:it,host:D.bindServerUrl,allowedOrigins:st.includes("*")?"*":[`http://localhost:${it}`,...st]};var h=e=>(t,r,o)=>{e(t),o()};var z=require("jose");var i=class extends Error{constructor(r,o){super(o);this.status=r;this.message=o}};var ut=new TextEncoder,ct=ut.encode(T.str("JWT_SECRET")),mt=ut.encode(T.str("JWT_REFRESH_SECRET")),Ae=async({userId:e})=>new z.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign(ct),Oe=async({userId:e})=>new z.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign(mt),lt=async(e,t)=>{try{let{payload:r}=await(0,z.jwtVerify)(e,t);if(!r.sub)throw new i(401,"Failed to verify access token");return{userId:r.sub}}catch(r){throw r instanceof i?r:r instanceof Error?new i(401,r.message):new i(401,"Failed to verify refresh token")}},dt=async e=>lt(e,ct),pt=async e=>lt(e,mt);var f=(e,t)=>{let r=e.body;return t&&t(r),r},v=(e,t)=>{let r=e.query;return t&&t(r),r},y=(e,t)=>{let r=e.params;return t&&t(r),r};var yt=P(require("bcryptjs"));var ft=e=>{if(!e?.username)throw new i(400,"Username is required");if(!e?.password)throw new i(400,"Password is required")};var ue="DATARAMEN_refresh_token",Pe={httpOnly:!0,secure:T.bool("PROD"),sameSite:T.bool("PROD"),path:"/",maxAge:14400*60},Tt=h(e=>{e.route({method:"post",url:"/login",config:{isPublic:!0},handler:async(t,r)=>{let{username:o,password:a}=f(t,ft),n=await w.findOne({where:{username:o}});if(!n||!yt.default.compareSync(a,n.password))throw new i(401,"Invalid credentials");let[u,s]=await Promise.all([Ae({userId:n?.id}),Oe({userId:n?.id})]);return r.setCookie(ue,s,Pe),{data:{accessToken:u}}}}),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 pt(o),[n,u]=await Promise.all([Ae({userId:a}),Oe({userId:a})]);return r.setCookie(ue,u,Pe),{data:{accessToken:n}}}}),e.route({method:"post",url:"/logout",config:{isPublic:!0},handler:async(t,r)=>(r.clearCookie(ue,Pe),{data:!0})})});var gt=e=>{if(!e.dbUrl)throw new i(400,"url is required");if(!e.dbUser)throw new i(400,"user is required");if(!e.dbType)throw new i(400,"type is required");if(!e.name)throw new i(400,"name is required");if(!e.dbDatabase)throw new i(400,"database is required")};var wt=P(require("mysql2/promise"));function J(e){if(e!==void 0)return e.toLowerCase()}var ho=({database:e,password:t,user:r,url:o})=>wt.default.createConnection({host:ne(o),user:r,database:e,password:t,dateStrings:!0}),bo=async e=>{let t=`
|
|
1
|
+
"use strict";var io=Object.create;var Me=Object.defineProperty;var uo=Object.getOwnPropertyDescriptor;var co=Object.getOwnPropertyNames;var mo=Object.getPrototypeOf,lo=Object.prototype.hasOwnProperty;var po=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of co(t))!lo.call(e,a)&&a!==r&&Me(e,a,{get:()=>t[a],enumerable:!(o=uo(t,a))||o.enumerable});return e};var O=(e,t,r)=>(r=e!=null?io(mo(e)):{},po(t||!e||!e.__esModule?Me(r,"default",{value:e,enumerable:!0}):r,e));var ae=require("dotenv"),ne=require("node:path"),$e=require("node:fs");var re=e=>{function t(a,n=void 0){return e[a]||n}function r(a,n=void 0){let u=e[a];if(!u)return n;let s=Number(u);return!isNaN(s)&&u.trim()!==""?s:n}function o(a){return e[a]==="true"||e[a]==="TRUE"||e[a]==="1"}return{str:t,num:r,bool:o}};function fo(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 oe=re(fo(process.argv.slice(2)));var yo=(()=>{try{let e=(0,$e.readFileSync)((0,ne.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})(),He=[],Qe=oe.str("env");Qe&&He.push((0,ne.resolve)(Qe));(0,ae.config)({path:He});var we={APP_DB_TYPE:"sqlite",APP_DB_DATABASE:"<home>/.dataramen/.runtime/db.sqlite3"};(0,ae.populate)(process.env,{SERVER_VERSION:yo.version,PROD:"true",...we},{override:!1});var To=["SYMM_ENCRYPTION_KEY","JWT_SECRET","JWT_REFRESH_SECRET"],We=()=>{let e=[];for(let t of To)process.env[t]||e.push(t);if(e.length>0)throw new Error("Following env variables are required but not provided: "+e.join(", "))},T=re(process.env),Ye=()=>T.str("APP_DB_TYPE")!==we.APP_DB_TYPE&&T.str("APP_DB_DATABASE")!==we.APP_DB_DATABASE;var km=require("reflect-metadata"),Xr=O(require("fastify")),Zr=O(require("qs"));var at=require("typeorm");var Ge=require("typeorm");var go={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"}},ho=oe.str("mode","default"),D=go[ho];var g=T.str("APP_DB_TYPE")==="sqlite"?"datetime":"timestamp",se=D.name==="docker"?e=>e==="localhost"||e==="127.0.0.1"?"host.docker.internal":e:e=>e;var Se=new Ge.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 je=require("typeorm");var Ee=new je.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 Ke=require("typeorm");var Ie=new Ke.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 Ve=require("typeorm");var Q=new Ve.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 nt=O(require("node:os")),st=require("node:path");var ze=require("typeorm");var V=new ze.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 Je=require("typeorm"),Ce=new Je.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 Xe=require("typeorm");var Re=new Xe.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 Ze=require("typeorm");var Ne=new Ze.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 et=require("typeorm");var q=new et.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 tt=require("typeorm");var B=new tt.EntitySchema({name:"DatabaseTable",tableName:"database_tables",columns:{id:{type:"uuid",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",joinColumn:{name:"dataSourceId"}},columns:{target:()=>"DatabaseColumn",type:"one-to-many",inverseSide:"table"}}});var rt=require("uuid");function bo(e){let t={};for(let r of e.entityMetadatas)for(let o of r.columns)o.isPrimary&&o.generationStrategy==="uuid"&&(t[r.name]?t[r.name].push(o.propertyName):t[r.name]=[o.propertyName]);return t}function wo(e){let t=bo(e);return{beforeInsert(r){if(console.log("Saving entity "+r.metadata.name),t[r.metadata.name])for(let o of t[r.metadata.name])r.entity[o]||(r.entity[o]=(0,rt.v4)())}}}var ot=e=>{e.subscribers.push(wo(e))};function So(){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>",nt.default.homedir())),e}var b=new at.DataSource({type:T.str("APP_DB_TYPE"),database:So(),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:[st.posix.join(__dirname,"migrations","*.js")],entities:[Q,Se,Ee,Ce,Ie,V,Re,Ne,B,q]}),it=async()=>{if(!b.isInitialized)return b.initialize().then(e=>(ot(e),e));throw new Error("Already initialized")},E=b.getRepository(Q),F=b.getRepository(Se),w=b.getRepository(Ee),C=b.getRepository(Ce),W=b.getRepository(Ie),R=b.getRepository(V),_=b.getRepository(Re),A=b.getRepository(Ne),ie=b.getRepository(q),Y=b.getRepository(B);var ut=T.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),ct=T.num("PORT",4466),z={port:ct,host:D.bindServerUrl,allowedOrigins:ut.includes("*")?"*":[`http://localhost:${ct}`,...ut]};var h=e=>(t,r,o)=>{e(t),o()};var J=require("jose");var i=class extends Error{constructor(r,o){super(o);this.status=r;this.message=o}};var mt=new TextEncoder,lt=mt.encode(T.str("JWT_SECRET")),dt=mt.encode(T.str("JWT_REFRESH_SECRET")),Ae=async({userId:e})=>new J.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign(lt),Pe=async({userId:e})=>new J.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign(dt),pt=async(e,t)=>{try{let{payload:r}=await(0,J.jwtVerify)(e,t);if(!r.sub)throw new i(401,"Failed to verify access token");return{userId:r.sub}}catch(r){throw r instanceof i?r:r instanceof Error?new i(401,r.message):new i(401,"Failed to verify refresh token")}},ft=async e=>pt(e,lt),yt=async e=>pt(e,dt);var f=(e,t)=>{let r=e.body;return t&&t(r),r},v=(e,t)=>{let r=e.query;return t&&t(r),r},y=(e,t)=>{let r=e.params;return t&&t(r),r};var gt=O(require("bcryptjs"));var Tt=e=>{if(!e?.username)throw new i(400,"Username is required");if(!e?.password)throw new i(400,"Password is required")};var ue="DATARAMEN_refresh_token",Oe={httpOnly:!0,secure:T.bool("PROD"),sameSite:T.bool("PROD"),path:"/",maxAge:14400*60},ht=h(e=>{e.route({method:"post",url:"/login",config:{isPublic:!0},handler:async(t,r)=>{let{username:o,password:a}=f(t,Tt),n=await w.findOne({where:{username:o}});if(!n||!gt.default.compareSync(a,n.password))throw new i(401,"Invalid credentials");let[u,s]=await Promise.all([Ae({userId:n?.id}),Pe({userId:n?.id})]);return r.setCookie(ue,s,Oe),{data:{accessToken:u}}}}),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 yt(o),[n,u]=await Promise.all([Ae({userId:a}),Pe({userId:a})]);return r.setCookie(ue,u,Oe),{data:{accessToken:n}}}}),e.route({method:"post",url:"/logout",config:{isPublic:!0},handler:async(t,r)=>(r.clearCookie(ue,Oe),{data:!0})})});var bt=e=>{if(!e.dbUrl)throw new i(400,"url is required");if(!e.dbUser)throw new i(400,"user is required");if(!e.dbType)throw new i(400,"type is required");if(!e.name)throw new i(400,"name is required");if(!e.dbDatabase)throw new i(400,"database is required")};var Et=O(require("mysql2/promise"));function X(e){if(e!==void 0)return e.toLowerCase()}var Eo=({database:e,password:t,user:r,url:o})=>Et.default.createConnection({host:se(o),user:r,database:e,password:t,dateStrings:!0}),Io=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=
|
|
6
|
+
`,[r]=await e.execute(t),o={};return r.forEach(a=>{let n=X(a.TABLE_NAME),u=a.COLUMN_NAME;o[n]||(o[n]=[]),o[n].push(u)}),o},Co=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},
|
|
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},Ro=async(e,t)=>{let o=(await t.query("SHOW TABLES"))[0],a=await Co(t),n=await Io(t),u=o.map(async s=>{let m=X(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(u)},wt=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}),u=a?.constructor?.name;if(u==="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(u==="Array"){let s=a;return{columns:n?.map(m=>({column:m.orgName||m.name,table:X(m.orgTable),alias:m.name,full:m.orgTable?X(m.orgTable)+"."+m.orgName:m.name}))||[],rows:s,query:e}}throw new Error(`[MYSQL CONN] Unknown result type: ${u}`)}catch(a){throw console.error(a),a instanceof i?a:new i(400,a.message)}},No=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}},Ao=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}},De=async e=>{let t=await Eo(e),r=!1;return{dbType:"mysql",dataSource:e,inspectSchema:()=>Ro(e,t),executeQuery:o=>o.type==="SELECT"?Ao(t,()=>wt(o.sql,o.params,t,o)):No(t,()=>wt(o.sql,o.params,t,o)),checkConnection:async()=>t.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.destroy()}}};var Ct=O(require("pg"));var Po=async({database:e,password:t,user:r,url:o,port:a})=>{let n=new Ct.default.Client({host:se(o),user:r,database:e,password:t,port:a,query_timeout:1e4});return await n.connect(),n},Oo=async e=>{let r=await e.query(`
|
|
18
18
|
SELECT
|
|
19
19
|
LOWER(kcu.table_name) as table_name,
|
|
20
20
|
kcu.column_name,
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
tc.constraint_type = 'PRIMARY KEY'
|
|
29
29
|
ORDER BY
|
|
30
30
|
table_name, kcu.ordinal_position;
|
|
31
|
-
`),o={};return r.rows.forEach(a=>{let n=a.table_name,u=a.column_name;o[n]||(o[n]=[]),o[n].push(u)}),o},
|
|
31
|
+
`),o={};return r.rows.forEach(a=>{let n=a.table_name,u=a.column_name;o[n]||(o[n]=[]),o[n].push(u)}),o},Do=async e=>{let r=await e.query(`
|
|
32
32
|
SELECT
|
|
33
33
|
LOWER(tc.table_name) AS table_name,
|
|
34
34
|
kcu.column_name AS field,
|
|
@@ -43,16 +43,16 @@
|
|
|
43
43
|
ON ccu.constraint_name = tc.constraint_name
|
|
44
44
|
AND ccu.table_schema = tc.table_schema
|
|
45
45
|
WHERE tc.constraint_type = 'FOREIGN KEY';
|
|
46
|
-
`),o={};return r.rows.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},
|
|
46
|
+
`),o={};return r.rows.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},xo=async(e,t)=>{let r=`SELECT LOWER(tablename) as tablename FROM pg_catalog.pg_tables WHERE schemaname = '${e.schema}'`,a=(await t.query(r)).rows,n=await Do(t),u=await Oo(t),s=a.map(async m=>{let c=Object.values(m)[0],l=`
|
|
47
47
|
SELECT column_name, data_type
|
|
48
48
|
FROM information_schema.columns
|
|
49
49
|
WHERE
|
|
50
50
|
LOWER(table_name) = '${c}' and
|
|
51
51
|
table_schema = '${e.schema}'
|
|
52
|
-
`,{rows:p}=await t.query(l),d=n[c];return{columns:p.map(N=>({name:N.column_name,type:N.data_type,isPrimary:u[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,
|
|
52
|
+
`,{rows:p}=await t.query(l),d=n[c];return{columns:p.map(N=>({name:N.column_name,type:N.data_type,isPrimary:u[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,k)=>N.isPrimary&&k.isPrimary?N.name.localeCompare(k.name):N.isPrimary?-1:1),createdAt:new Date,tableName:c,updatedAt:new Date}});return Promise.all(s)},vo=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),{})},St=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:u,rowCount:s}=await r.query({text:e,rowMode:"array",values:t});if(u==="UPDATE"||u==="INSERT"||u==="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(u==="SELECT"){let m=n.map(l=>`'${l.tableID}-${l.columnID}'`),c=await Oo(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: ${u}`)}catch(a){throw a instanceof i?a:new i(400,a.message)}},Po=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}},Do=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}},xe=async e=>{let t=await Co(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:()=>Ao(e,t),executeQuery:n=>a(()=>n.type==="SELECT"?Do(t,()=>St(n.sql,n.params,t,n)):Po(t,()=>St(n.sql,n.params,t,n))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.end()}}};var $=async(e,t,r)=>{try{let o;if(t==="mysql")o=await De(e);else if(t==="postgres")o=await xe(e);else throw new i(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 i?o:o?.code==="ECONNREFUSED"?new i(500,"Failed to connect to the database"):new i(500,o.message)}},It=async(e,t)=>{try{let r;if(t==="mysql")r=await De(e);else if(t==="postgres")r=await xe(e);else throw new i(500,`Connection manager for ${t} not found`);return r}catch(r){throw console.error(r),r instanceof i?r:r?.code==="ECONNREFUSED"?new i(500,"Failed to connect to the database"):new i(500,r.message)}};var ce=P(require("node:crypto"));var Ct="aes-256-gcm",xo=12,Rt=()=>{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},vo=e=>{let t=ce.default.randomBytes(xo),r=Rt(),o=ce.default.createCipheriv(Ct,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")}},_o=({encrypted:e,iv:t,tag:r})=>{let o=Rt(),a=ce.default.createDecipheriv(Ct,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:vo,decrypt:_o};var U=(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 Nt=[{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"}],Uo=Nt.reduce((e,t)=>(e[t.value]=t.label,e),{}),ms=Nt.reduce((e,t)=>(e[t.label]=t.value,e),{}),Y=e=>e.map(t=>({label:Uo[t],value:t})),ls=Y(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),ds=Y(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL","CONTAINS","NOT CONTAINS"]),ps=Y(["=","<>","IS NULL","IS NOT NULL"]),fs=Y(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),ys=Y(["IS NULL","IS NOT NULL"]),Ts=Y(["IN","NOT IN"]),ko=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"],Lo=new Set(ko),le=e=>Lo.has(e),qo=["integer","smallint","decimal","numeric","float","real","double precision","int","smallint","integer","bigint","decimal","numeric","real","double precision","serial","bigserial","money"],Bo=new Set(qo),At=e=>Bo.has(e);var gs=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var ve={read_only:10,editor:20,admin:30,owner:40};var O=e=>e.startsWith("'")&&e.endsWith("'")||e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e;var Ot={operator:"LIKE",parse:e=>{let t=e.match(/^LIKE\s*["'](.*)["']$/i);if(t)return[{value:O(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:O(t[1])}]},stringify:e=>`NOT LIKE "%${e[0]?.value}%"`},Dt={operator:"CONTAINS",parse:e=>{let t=e.match(/^CONTAINS\s*["'](.*)["']$/i);if(t)return[{value:O(t[1])}]},stringify:(e,t)=>le(t)?`${e[0]?.value}`:`CONTAINS "%${e[0]?.value}%"`},xt={operator:"NOT CONTAINS",parse:e=>{let t=e.match(/^NOT CONTAINS\s*["'](.*)["']$/i);if(t)return[{value:O(t[1])}]},stringify:e=>`NOT CONTAINS "%${e[0]?.value}%"`};function _t(e){return e===""?[]:Qo(e).map(Fo)}function Qo(e){let t=[],r=0,o="",a=!1,n=!1;for(;r<e.length;){let u=e[r];if((a||n)&&u==="\\"){o+=e[r+1],r+=2;continue}if(u==="'"&&!n){a=!a,o+=u,r++;continue}if(u==='"'&&!a){n=!n,o+=u,r++;continue}if(u===","&&!a&&!n){t.push(o.trim()),o="",r++;continue}o+=u,r++}if(o.trim()!==""&&t.push(o.trim()),a||n)throw new Error("Unterminated string literal");return t}function Fo(e){if(e.startsWith("'")&&e.endsWith("'"))return{value:vt(e.slice(1,-1),"'")};if(e.startsWith('"')&&e.endsWith('"'))return{value:vt(e.slice(1,-1),'"')};let t=Number(e);if(!Number.isNaN(t))return{value:t};throw new Error(`Invalid literal: ${e}`)}function vt(e,t){return e.replace(/\\(.)/g,(r,o)=>o)}var Ut={operator:"IN",parse:e=>{let t=e.match(/^in\s*\((.*)\)$/i);if(t)return _t(t[1])},stringify:e=>`IN (${e?.map(t=>`"${t.value}"`).join(", ")})`},kt={operator:"NOT IN",parse:e=>{let t=e.match(/^not\s+in\s*\((.*)\)$/i);if(t)return _t(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:O(t[1])}]},stringify:(e,t)=>At(t)?`${e[0]?.value}`:`= ${e[0]?.value}`},qt={operator:"!=",parse:e=>{let t=e.match(/^!=\s*(.*)$/);if(t)return[{value:O(t[1])}]},stringify:e=>`!= ${e[0]?.value}`},Bt={operator:"<>",parse:e=>{let t=e.match(/^<>\s*(.*)$/);if(t)return[{value:O(t[1])}]},stringify:e=>`<> ${e[0]?.value}`},Qt={operator:">",parse:e=>{let t=e.match(/^>\s*(.*)$/);if(t)return[{value:O(t[1])}]},stringify:e=>`> ${e[0]?.value}`},Ft={operator:">=",parse:e=>{let t=e.match(/^>=\s*(.*)$/);if(t)return[{value:O(t[1])}]},stringify:e=>`>= ${e[0]?.value}`},Mt={operator:"<",parse:e=>{let t=e.match(/^<\s*(.*)$/);if(t)return[{value:O(t[1])}]},stringify:e=>`< ${e[0]?.value}`},$t={operator:"<=",parse:e=>{let t=e.match(/^<=\s*(.*)$/);if(t)return[{value:O(t[1])}]},stringify:e=>`<= ${e[0]?.value}`};var Ht={operator:"IS NULL",parse:e=>{if(/^is\s+null$/i.test(e))return[]},stringify:()=>"IS NULL"},Wt={operator:"IS NOT NULL",parse:e=>{if(/^is\s+not\s+null$/i.test(e))return[]},stringify:()=>"IS NOT NULL"};var Mo=[Ot,Dt,Pt,xt,Ut,kt,Lt,qt,Bt,Ft,Qt,$t,Mt,Ht,Wt];function $o(e){let t=e.trim();for(let r of Mo){let o=r.parse(t);if(o)return{operator:r.operator,value:o}}}var Yt={parse:$o};var S=e=>{let t=ve[e];return r=>ve[r.currentTeamRole]>=t},Gt=async e=>{let t=e.routeOptions.config.requireRole;if(t&&!t(e.user))throw new i(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 Ho(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 jt=async e=>{let t=await E.findOne({where:{id:e},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]});if(!t)throw new Error("Data source not found");return t.status="INSPECTING",await E.save(t),b.transaction(async r=>{let a=await(await It(U(t,!0),t.dbType)).inspectSchema();await de(r,t.id);let n=Ho(a);for(let u of a){let s=await r.save(B,{datasource:{id:e},name:u.tableName});if(u.columns){let m=[];for(let c of u.columns)m.push(se.create({table:{id:s.id},name:c.name,isPrimary:!!c.isPrimary,type:c.type,meta:{refs:c.ref,referencedBy:n.get(`${s.name}.${c.name}`)}}));await r.save(q,m)}}await r.save(M,{id:e,status:"READY",lastInspected:new Date})}).catch(r=>{console.error(r),E.save({id:e,status:"FAILED"})}),!0};var Kt=h(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=y(t),o=await E.findOne({where:{id:r}});if(!o)throw new i(404,"Data source not found");return{data:o}}}),e.route({method:"get",url:"/",handler:async t=>{let{teamId:r}=v(t);return{data:await E.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}=f(t,gt),n=E.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),u=await $(U(n),n.dbType,t);try{await u.checkConnection()}catch{throw new i(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 E.save(n)}}}),e.route({method:"put",url:"/:id",config:{requireRole:S("admin")},handler:async t=>{let{id:r}=y(t),o=f(t),a=await E.findOneBy({id:r});if(!a)throw new i(404,"Data source not found");let n=E.merge(a,o);return await E.save(n),{data:n}}}),e.route({method:"delete",url:"/:id",config:{requireRole:S("admin")},handler:async t=>b.transaction(async r=>{let{id:o}=y(t);await Promise.all([de(r,o),r.delete(K,{dataSource:{id:o}})]),await r.delete(M,{id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=y(t);return{data:{started:await jt(o)}}}}),e.route({method:"get",url:"/:id/inspections",handler:async t=>{let{id:r}=y(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(u=>({name:u.name,type:u.type,isPrimary:u.isPrimary,ref:u.meta?.refs}))}))}}})});var k=require("typeorm"),Vt=h(e=>{e.route({method:"get",url:"/team/:teamId/datasources",handler:async t=>{let{teamId:r}=y(t);return{data:await E.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=y(t),o=v(t),a=r.teamId||t.user.currentTeamId,n=Number(o.size)||20,u=Number(o.page)||0,s=o.nameFilter?.length?{name:(0,k.Raw)(p=>`LOWER(${p}) LIKE :search`,{search:`%${o.nameFilter.toLowerCase()}%`})}:void 0,m=await _.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:u*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/query",handler:async t=>{let{teamId:r}=y(t),{search:o,size:a,selectedDataSources:n}=v(t),u=o.length>3?parseInt(a)||20:8,s={};n?.length&&(s.id=(0,k.In)(n));let[m,c,l]=await Promise.all([ie.find({where:{name:(0,k.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:u}),A.find({where:{searchString:(0,k.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:u}),_.find({where:{searchString:(0,k.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:u})]),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}=y(t),o=v(t),a=Number(o.page),n=Number(o.size),u=t.user.id,s={team:{id:r},user:{id:u}};o.nameFilter?.length&&(s.name=(0,k.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 zt=h(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=y(t),o=await R.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=f(t),o=await E.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await R.save(R.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}=y(t),o=f(t);if(!(await R.update(r,o)).affected)throw new i(404,"Query not found");return{data:await R.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",config:{requireRole:S("editor")},handler:async t=>b.transaction(async()=>{let{id:r}=y(t);if(!(await R.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var Jt=e=>e&&le(e)?"CONTAINS":"=",Ue=(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("."),u=t(a,n);if(o.isAdvanced){let s=Yt.parse(o.value);if(!s)throw new i(400,`Invalid value for '${o.column}': ${o.value}`);r.push({value:s.value,column:o.column,operator:s.operator||Jt(u?.type),fn:o.fn})}else r.push({value:o.value?[{value:o.value}]:[],column:o.column,operator:Jt(u?.type),fn:o.fn})}return r},Xt=e=>{let t=[e.table];return e.joins&&e.joins.forEach(({table:r})=>t.push(r)),t},_e=e=>({column:e.value,fn:e.fn,distinct:e.distinct}),Zt=(e,t,r)=>{let o=[];return t.length>0||r.length>0?o.push(...t.map(_e),...r.map(_e)):e.length>0&&o.push(...e.map(_e)),o},Wo=e=>e.isPrimary&&e.table?.name?{table:e.table.name,field:e.name}:e?.meta?.refs,Yo=e=>e?.meta?.referencedBy,er=(e,t,r)=>t.map((o,a)=>{let n=o.table?r(o.table,o.column):void 0,u=n?Wo(n):void 0,s=n?Yo(n):void 0;return{...o,full:e[a].fn?e[a].column:o.full,type:n?.type,fn:e[a].fn,ref:u,referencedBy:s}}),tr=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"}),t.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 ke=require("typeorm"),rr=new ke.DataSource({type:"mysql"}),or=new ke.DataSource({type:"postgres"}),G=e=>{switch(e){case"postgres":return or.createQueryBuilder();case"mysql":return rr.createQueryBuilder();default:throw new Error("Unsupported database connection")}},pe={postgres:or.driver,mysql:rr.driver};var X=(e,t,r)=>{let{column:o,operator:a,value:n}=e,u="_"+t;switch(a){case"IS NULL":case"IS NOT NULL":return[`${o} ${a}`,{value:void 0}];case"IN":case"NOT IN":return[`${o} ${a} (:...${u})`,{[u]:n?.map(c=>c.value)}];case"LIKE":case"CONTAINS":return[`${o} ${r==="postgres"?"ILIKE":"LIKE"} :${u}`,{[u]:a==="CONTAINS"?`%${n?.[0].value}%`:n?.[0].value}];case"NOT LIKE":case"NOT CONTAINS":return[`${o} ${r==="postgres"?"NOT ILIKE":"NOT LIKE"} :${u}`,{[u]:a==="NOT CONTAINS"?`%${n?.[0].value}%`:n?.[0].value}];default:return[`${o} ${a} :${u}`,{[u]:n?.[0]?.value}]}};var ar=e=>{let t=pe[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 nr=["SUM","COUNT","AVG","MAX","MIN"],Go=["YEAR","MONTH","DAY",...nr],jo=Go.reduce((e,t)=>(e[t]=!0,e),{}),Ko=nr.reduce((e,t)=>(e[t]=!0,e),{}),sr=e=>jo[e],ir=e=>Ko[e];var fe=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,ur={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:fe,MAX:fe,MIN:fe,COUNT:fe};var ye=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,cr={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:ye,MAX:ye,MIN:ye,COUNT:ye};var Vo=e=>{let t=[];return e.fn&&t.push(e.fn),e.distinct&&t.push("distinct"),t.push(e.column),t.join(" ")},zo=e=>{let t=ar(e),r=e==="postgres"?ur:cr;return o=>o.fn&&sr(o.fn)?r[o.fn](t(o.column),o.fn,o.distinct):t(o.column)};function mr(e,t){let r=G(t.dbType).from(e,e),o=!1,a=0,n=zo(t.dbType),u={};return{setColumns(s){s.forEach(m=>{let c=Vo(m);u[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!!u[s]},build(){o||r.limit(50);let[s,m]=r.getQueryAndParameters();return{sql:s,params:m}}}}var lr=(e,t)=>{let r=G(t.dbType).update(e),o=0;return{addWhere(a){let[n,u]=X(a,++o,t.dbType);r.andWhere(n,u)},setParams(a){let n={};for(let[u,s]of Object.entries(a)){let m=`${s}`;m.startsWith("=")?n[u]=()=>m.substring(1):n[u]=m}r.set(n)},build(){let[a,n]=r.getQueryAndParameters();return{sql:a,params:n}}}};var dr=(e,t)=>{let r=G(t.dbType).insert().into(e);return{setValues(o){let a={};for(let[n,u]of Object.entries(o)){let s=`${u}`;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 Le=mr,pr=lr,fr=dr;var yr=require("typeorm"),Tr=async(e,t)=>{let r=await se.find({where:{table:{name:(0,yr.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 Jo(e,t,r){return R.save(R.create({user:{id:e},team:{id:t},dataSource:{id:r.datasourceId},name:r.name,opts:r.opts}))}var Te=async(e,t)=>{let{datasourceId:r,size:o=20,page:a}=t,{table:n,joins:u,groupBy:s,orderBy:m}=t.opts,c=await ge(r);if(!c)throw new i(404,"Datasource not found");let l=Zt(t.opts.columns,t.opts.groupBy,t.opts.aggregations),p=Xt(t.opts),d=await Tr(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 i(400,`Invalid column ${I.column}`)});let Xr=Jo(e.user.id,e.user.currentTeamId,t),x=Le(n,c);x.setLimit(o+1),x.setOffset(o*a),x.setColumns(L),u&&u.forEach(x.addJoin),m.length>0&&m.forEach(({column:I,direction:ao})=>{x.hasAlias(I)&&x.addOrderBy(pe[c.dbType].escape(I),ao)}),s&&s.length>0&&s.forEach(I=>{d.hasColumn(I.value)&&x.addGroupBy({column:I.value,fn:I.fn,distinct:I.distinct})}),Ue(t.opts.filters,d.getColumnByName).forEach(I=>{I.fn&&ir(I.fn)?x.addHaving(I):x.addWhere(I)});let{sql:Zr,params:eo}=x.build(),ee=await(await $(U(c,!0),c.dbType,e)).executeQuery({sql:Zr,params:eo,type:"SELECT",allowBulkUpdate:!1}),Be=ee.rows.length>o;Be&&ee.rows.pop();let{id:to}=await Xr,Qe=er(L,ee.columns,d.getColumnByName),{hooks:ro,entities:oo}=tr(Qe);return{...ee,queryHistoryId:to,tables:p,allColumns:N,availableHooks:ro,availableEntities:oo,availableJoins:d.getAvailableJoins(),columns:Qe,hasMore:Be}},gr=async(e,t)=>{let r=await ge(t.dataSourceId);if(!r)throw new i(400,"Invalid datasource");let o=await $(U(r,!0),r.dbType,e),a=Le(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:u}=a.build(),s=await o.executeQuery({sql:n,params:u,type:"SELECT",allowBulkUpdate:!1});if(s.rows.length>1)throw new i(400,"Found multiple rows for given query");if(s.rows.length<1)throw new i(404,"Entity not found");return{entity:s.rows[0],columns:s.columns,sql:n}},hr=async(e,t)=>{let r=await ge(t.datasourceId);if(!r)throw new i(404,"Data source not found");if(!r.allowUpdate)throw new i(403,"This datasource does not allow update operations");let o=pr(t.table,r);o.setParams(t.values),Ue(t.filters,()=>{}).forEach(s=>{o.addWhere(s)});let{sql:a,params:n}=o.build();return(await $(U(r,!0),r.dbType,e)).executeQuery({sql:a,params:n,type:"UPDATE",allowBulkUpdate:!1})},br=async(e,t)=>{let r=await ge(t.datasourceId);if(!r)throw new i(404,"Data source not found");if(!r.allowInsert)throw new i(403,"This datasource does not allow insert operations");let o=fr(t.table,r);o.setValues(t.values);let{sql:a,params:n}=o.build();return(await $(U(r,!0),r.dbType,e)).executeQuery({sql:a,type:"INSERT",params:n,allowBulkUpdate:!1})};async function ge(e){return E.findOne({where:{id:e},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowUpdate","allowInsert"]})}var wr=e=>{},Xo=["--",";","DROP","drop"],Sr=([e,t])=>{if(typeof t=="string"&&t.startsWith("=")){let r=t;Xo.forEach(o=>{if(r.includes(o))throw new i(400,"Invalid input value for "+e)})}},Er=e=>{if(!e.table)throw new i(400,"Table is required");Object.entries(e.values).forEach(Sr)},Ir=e=>{if(!e.table)throw new i(400,"Table is required");Object.entries(e.values).forEach(Sr)};var Cr=h(e=>{e.route({method:"post",url:"/:dsId/select",handler:async t=>{let r=f(t,wr);return{data:await Te(t,r)}}}),e.route({method:"get",url:"/:dsId/entity/:table",handler:async t=>{let{dsId:r,table:o}=y(t),a=v(t);return{data:await gr(t,{table:o,dataSourceId:r,props:a})}}}),e.route({method:"post",url:"/:dsId/insert",config:{requireRole:S("editor")},handler:async t=>{let r=f(t,Er);return{data:await br(t,r)}}}),e.route({method:"post",url:"/:dsId/update",config:{requireRole:S("editor")},handler:async t=>{let r=f(t,Ir);return{data:await hr(t,r)}}})});var Rr=h(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:T.str("SERVER_VERSION")}}))});var Nr=h(e=>{e.route({method:"get",url:"/:id/users",handler:async t=>{let{id:r}=y(t),o=await Q.findOne({where:{id:r},relations:{users:{user:!0}}});if(!o)throw new i(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=f(t),a=w.create();a.id=r;let n=Q.create(o);await Q.save(n);let u=C.create({user:a,team:n});return await C.save(u),{data:n}})}),e.route({method:"patch",url:"/:id/user-role",config:{requireRole:S("admin")},handler:async t=>{let{id:r}=y(t),{role:o,userId:a}=f(t,({role:u})=>{if(u==="owner")throw new i(400,"Only one owner is allowed")});if((await C.findOneBy({user:{id:a},team:{id:r}}))?.role==="owner")throw new i(400,"Cannot change owner role");await C.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}=y(t),{userId:o}=v(t);if((await C.findOneBy({user:{id:o},team:{id:r}}))?.role==="owner")throw new i(400,"Cannot delete team owner");await w.update(o,{currentTeam:null}),await C.delete({user:{id:o},team:{id:r}}),await w.delete({id:o})})})});var qe=P(require("bcryptjs")),Z=async e=>{let t=await qe.default.genSalt(10);return qe.default.hash(e,t)};var Ar=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 i(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=f(t);if(o.password&&(o.password=await Z(o.password)),!(await w.update(r,o)).affected)throw new i(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=f(t),o=await Z(r.password),a=await w.save(w.create({username:r.username,password:o})),n=await C.save(C.create({role:"read_only",team:{id:r.teamId},user:{id:a.id}}));await w.update(a.id,{currentTeam:{id:n.id}})})})});var Or=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}=f(t);if(!r.id)throw new i(400,"Settings id is required!");if(!(await W.update(r.id,r)).affected)throw new i(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 Pr=h(e=>{e.route({method:"post",url:"/",config:{requireRole:S("editor")},handler:async t=>{let r=f(t),o=await R.findOne({where:{id:r.queryId}});if(!o)throw new i(400,"Query not found");let a=await _.save(_.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 R.update(r.queryId,{name:r.name}),{data:a}}}),e.route({method:"delete",url:"/:id",config:{requireRole:S("editor")},handler:async t=>{let{id:r}=y(t);if(!(await _.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}=y(t),o=f(t,u=>{if(!u.name)throw new i(400,"Name is required")}),a=await _.findOne({where:{id:r},relations:{query:!0}});if(!a)throw new i(400,"Query not found");let n=j(a.query.opts,o.name);return await Promise.all([_.update({id:r},{searchString:n}),R.update({id:a.query.id},{name:o.name})]),{data:!0}})})});var Dr=e=>{if(!e.queryId&&!(e.opts&&e.name))throw new i(400,"Either queryId or name and opts are required")};var xr=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}=y(t),{currentTeamId:o,id:a}=t.user,n=await A.findOne({where:{id:r,team:{id:o},user:{id:a}}});if(!n)throw new i(404,"Not Found");return{data:n}}}),e.route({method:"post",url:"/",handler:async t=>{let{opts:r,name:o,queryId:a}=f(t,Dr),n,u,s=o;if(r)u=r.dataSourceId,n=r;else{let c=await R.findOne({where:{id:a},relations:{dataSource:!0}});if(!c)throw new i(404,"Query not Found");u=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:u},user:{id:t.user.id},team:{id:t.user.currentTeamId}}))}}}),e.route({method:"post",url:"/:id/run",handler:async t=>{let{id:r}=y(t),o=f(t),a=await A.findOne({where:{id:r},relations:{user:!0}});if(!a)throw new i(404,"Not found");if(a.user?.id!==t.user.id)throw new i(404,"Not found");return o&&A.update(r,{opts:o||{},searchString:j(o,a.name),updatedAt:new Date}),{data:{result:await Te(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}=y(t),o=f(t),a=await A.findOne({where:{id:r,user:{id:t.user.id}}});if(!a)throw new i(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}=y(t),o=t.user.id;return await A.delete({id:r,user:{id:o}}),{data:!0}}})});var Ur=require("node:crypto");var vr=require("node:crypto"),_r={teamName:"Default Team",username:"admin"},Zo=async()=>{let e=await Q.findOneBy({});return e||Q.save(Q.create({name:_r.teamName}))},he=async e=>{let t=await C.findOne({where:{role:"owner"},relations:{user:!0}});if(t)return t.user;let r=await Zo(),o=await Z(e?.password||(0,vr.randomBytes)(32).toString("hex")),a=await w.save(w.create({username:e?.name||_r.username,password:o})),n=await C.save(C.create({user:a,team:r,role:"owner"}));return await w.update(a.id,{currentTeam:n}),a};var be={setupAccessToken:void 0},kr=()=>(be.setupAccessToken=(0,Ur.randomBytes)(32).toString("hex"),be.setupAccessToken),ea=e=>{if(!be.setupAccessToken)throw new i(400,"Setup already performed");if(!e||e!==be.setupAccessToken)throw new i(400,"Invalid setup access token")},H=async()=>D.skipAuth?!1:await w.count()<1,Lr=async e=>{ea(e.setupAccessToken),await he({name:e.userName,password:e.userPassword})};var qr=h(e=>{e.route({method:"get",url:"/client.config.js",handler:(t,r)=>{let o={skipAuth:D.skipAuth,modeName:D.name,usesCustomDb:Ye(),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 Br=e=>{if(!e.setupAccessToken)throw new i(400,"Invalid setup access token");if(!e.userPassword||e.userPassword.length<8)throw new i(400,"Password should be at least 8 chars long");if(!e.userName)throw new i(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 i(400,"Setup has already been completed");let o=f(t,Br);return await Lr(o),{data:!0}}})});var ta=[[qr,"/"],[Tt,"/api/auth"],[Kt,"/api/data-sources"],[Vt,"/api/project"],[zt,"/api/queries"],[Cr,"/api/runner"],[Rr,"/api/status"],[Nr,"/api/teams"],[Ar,"/api/users"],[Or,"/api/user-settings"],[Pr,"/api/saved-queries"],[xr,"/api/workbench-tabs"],[Qr,"/api/setup"]],Fr=e=>{for(let[t,r]of ta)e.register(t,{prefix:r}),console.log("Registered "+r)};var ra=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),oa=async()=>C.findOne({where:{role:"owner"},relations:{user:!0,team:!0}}),aa=async e=>{let t=await oa();if(!t)throw new i(401,"User is not part of a team");e.user={id:t.user.id,currentTeamId:t.team.id,currentTeamRole:t.role}},na=async e=>{let t=e.headers.authorization;if(!t)throw new i(401,"Missing auth token");let[r,o]=t.split(" "),{userId:a}=await dt(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 i(401,"Unauthorized");e.user={id:a,currentTeamId:n.currentTeam.team.id,currentTeamRole:n.currentTeam.role}},Mr=async e=>{ra(e)||(D.skipAuth?await aa(e):await na(e))};var $r=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Hr=e=>{e.addHook("onRequest",Mr),e.addHook("onRequest",Gt),e.addHook("onResponse",$r)};var Wr=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 i?o.status(t.status).send({error:t.message}):o.status(500).send({error:"Internal Server Error"})})};var Yr=P(require("@fastify/cookie")),Gr=P(require("@fastify/cors"));var jr=P(require("@fastify/static")),Kr=require("node:path"),Vr=e=>{e.register(Yr.default,{}),e.register(Gr.default,{origin:V.allowedOrigins,methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),e.register(jr.default,{root:(0,Kr.join)(__dirname,"web")})};(async function(){let t=(0,zr.default)({querystringParser:o=>Jr.default.parse(o)});if(We(),Vr(t),Hr(t),Fr(t),Wr(t),await t.after(),await nt(),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=kr();console.log(`Setup access token:
|
|
57
|
+
limit 75;`;return(await t.query(r)).rows.reduce((a,n)=>(a[n.row_key]={table:n.relname,column:n.attname},a),{})},It=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:u,rowCount:s}=await r.query({text:e,rowMode:"array",values:t});if(u==="UPDATE"||u==="INSERT"||u==="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(u==="SELECT"){let m=n.map(l=>`'${l.tableID}-${l.columnID}'`),c=await vo(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: ${u}`)}catch(a){throw a instanceof i?a:new i(400,a.message)}},_o=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}},Uo=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}},xe=async e=>{let t=await Po(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:()=>xo(e,t),executeQuery:n=>a(()=>n.type==="SELECT"?Uo(t,()=>It(n.sql,n.params,t,n)):_o(t,()=>It(n.sql,n.params,t,n))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.end()}}};var $=async(e,t,r)=>{try{let o;if(t==="mysql")o=await De(e);else if(t==="postgres")o=await xe(e);else throw new i(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 i?o:o?.code==="ECONNREFUSED"?new i(500,"Failed to connect to the database"):new i(500,o.message)}},Rt=async(e,t)=>{try{let r;if(t==="mysql")r=await De(e);else if(t==="postgres")r=await xe(e);else throw new i(500,`Connection manager for ${t} not found`);return r}catch(r){throw console.error(r),r instanceof i?r:r?.code==="ECONNREFUSED"?new i(500,"Failed to connect to the database"):new i(500,r.message)}};var ce=O(require("node:crypto"));var Nt="aes-256-gcm",Lo=12,At=()=>{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},ko=e=>{let t=ce.default.randomBytes(Lo),r=At(),o=ce.default.createCipheriv(Nt,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")}},qo=({encrypted:e,iv:t,tag:r})=>{let o=At(),a=ce.default.createDecipheriv(Nt,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:ko,decrypt:qo};var U=(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 Pt=[{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"}],Bo=Pt.reduce((e,t)=>(e[t.value]=t.label,e),{}),Ts=Pt.reduce((e,t)=>(e[t.label]=t.value,e),{}),G=e=>e.map(t=>({label:Bo[t],value:t})),gs=G(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),hs=G(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL","CONTAINS","NOT CONTAINS"]),bs=G(["=","<>","IS NULL","IS NOT NULL"]),ws=G(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),Ss=G(["IS NULL","IS NOT NULL"]),Es=G(["IN","NOT IN"]),Fo=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"],Mo=new Set(Fo),le=e=>Mo.has(e),Qo=["integer","smallint","decimal","numeric","float","real","double precision","int","smallint","integer","bigint","decimal","numeric","real","double precision","serial","bigserial","money"],$o=new Set(Qo),Ot=e=>$o.has(e);var Is=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var ve={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 Dt={operator:"LIKE",parse:e=>{let t=e.match(/^LIKE\s*["'](.*)["']$/i);if(t)return[{value:P(t[1])}]},stringify:e=>`LIKE "%${e[0]?.value}%"`},xt={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}%"`},vt={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}%"`},_t={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 Lt(e){return e===""?[]:Ho(e).map(Wo)}function Ho(e){let t=[],r=0,o="",a=!1,n=!1;for(;r<e.length;){let u=e[r];if((a||n)&&u==="\\"){o+=e[r+1],r+=2;continue}if(u==="'"&&!n){a=!a,o+=u,r++;continue}if(u==='"'&&!a){n=!n,o+=u,r++;continue}if(u===","&&!a&&!n){t.push(o.trim()),o="",r++;continue}o+=u,r++}if(o.trim()!==""&&t.push(o.trim()),a||n)throw new Error("Unterminated string literal");return t}function Wo(e){if(e.startsWith("'")&&e.endsWith("'"))return{value:Ut(e.slice(1,-1),"'")};if(e.startsWith('"')&&e.endsWith('"'))return{value:Ut(e.slice(1,-1),'"')};let t=Number(e);if(!Number.isNaN(t))return{value:t};throw new Error(`Invalid literal: ${e}`)}function Ut(e,t){return e.replace(/\\(.)/g,(r,o)=>o)}var kt={operator:"IN",parse:e=>{let t=e.match(/^in\s*\((.*)\)$/i);if(t)return Lt(t[1])},stringify:e=>`IN (${e?.map(t=>`"${t.value}"`).join(", ")})`},qt={operator:"NOT IN",parse:e=>{let t=e.match(/^not\s+in\s*\((.*)\)$/i);if(t)return Lt(t[1])},stringify:e=>`NOT IN (${e?.map(t=>`"${t.value}"`).join(", ")})`};var Bt={operator:"=",parse:e=>{let t=e.match(/^=\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:(e,t)=>Ot(t)?`${e[0]?.value}`:`= ${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}`},Qt={operator:">",parse:e=>{let t=e.match(/^>\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`> ${e[0]?.value}`},$t={operator:">=",parse:e=>{let t=e.match(/^>=\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`>= ${e[0]?.value}`},Ht={operator:"<",parse:e=>{let t=e.match(/^<\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`< ${e[0]?.value}`},Wt={operator:"<=",parse:e=>{let t=e.match(/^<=\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`<= ${e[0]?.value}`};var Yt={operator:"IS NULL",parse:e=>{if(/^is\s+null$/i.test(e))return[]},stringify:()=>"IS NULL"},Gt={operator:"IS NOT NULL",parse:e=>{if(/^is\s+not\s+null$/i.test(e))return[]},stringify:()=>"IS NOT NULL"};var Yo=[Dt,vt,xt,_t,kt,qt,Bt,Ft,Mt,$t,Qt,Wt,Ht,Yt,Gt];function Go(e){let t=e.trim();for(let r of Yo){let o=r.parse(t);if(o)return{operator:r.operator,value:o}}}var jt={parse:Go};var S=e=>{let t=ve[e];return r=>ve[r.currentTeamRole]>=t},Kt=async e=>{let t=e.routeOptions.config.requireRole;if(t&&!t(e.user))throw new i(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 jo(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 Vt=async e=>{let t=await E.findOne({where:{id:e},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]});if(!t)throw new Error("Data source not found");return t.status="INSPECTING",await E.save(t),b.transaction(async r=>{let a=await(await Rt(U(t,!0),t.dbType)).inspectSchema();await de(r,t.id);let n=jo(a);for(let u of a){let s=await r.save(B,Y.create({datasource:{id:e},name:u.tableName}));if(u.columns){let m=[];for(let c of u.columns)m.push(ie.create({table:{id:s.id},name:c.name,isPrimary:!!c.isPrimary,type:c.type,meta:{refs:c.ref,referencedBy:n.get(`${s.name}.${c.name}`)}}));await r.save(q,m)}}await r.save(Q,{id:e,status:"READY",lastInspected:new Date})}).catch(r=>{console.error(r),E.save({id:e,status:"FAILED"})}),!0};var zt=h(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=y(t),o=await E.findOne({where:{id:r}});if(!o)throw new i(404,"Data source not found");return{data:o}}}),e.route({method:"get",url:"/",handler:async t=>{let{teamId:r}=v(t);return{data:await E.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}=f(t,bt),n=E.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),u=await $(U(n),n.dbType,t);try{await u.checkConnection()}catch{throw new i(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 E.save(n)}}}),e.route({method:"put",url:"/:id",config:{requireRole:S("admin")},handler:async t=>{let{id:r}=y(t),o=f(t),a=await E.findOneBy({id:r});if(!a)throw new i(404,"Data source not found");let n=E.merge(a,o);return await E.save(n),{data:n}}}),e.route({method:"delete",url:"/:id",config:{requireRole:S("admin")},handler:async t=>b.transaction(async r=>{let{id:o}=y(t);await Promise.all([de(r,o),r.delete(V,{dataSource:{id:o}})]),await r.delete(Q,{id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=y(t);return{data:{started:await Vt(o)}}}}),e.route({method:"get",url:"/:id/inspections",handler:async t=>{let{id:r}=y(t);return{data:(await Y.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(u=>({name:u.name,type:u.type,isPrimary:u.isPrimary,ref:u.meta?.refs}))}))}}})});var L=require("typeorm"),Jt=h(e=>{e.route({method:"get",url:"/team/:teamId/datasources",handler:async t=>{let{teamId:r}=y(t);return{data:await E.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=y(t),o=v(t),a=r.teamId||t.user.currentTeamId,n=Number(o.size)||20,u=Number(o.page)||0,s=o.nameFilter?.length?{name:(0,L.Raw)(p=>`LOWER(${p}) LIKE :search`,{search:`%${o.nameFilter.toLowerCase()}%`})}:void 0,m=await _.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:u*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/query",handler:async t=>{let{teamId:r}=y(t),{search:o,size:a,selectedDataSources:n}=v(t),u=o.length>3?parseInt(a)||20:8,s={};n?.length&&(s.id=(0,L.In)(n));let[m,c,l]=await Promise.all([Y.find({where:{name:(0,L.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:u}),A.find({where:{searchString:(0,L.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:u}),_.find({where:{searchString:(0,L.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:u})]),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}=y(t),o=v(t),a=Number(o.page),n=Number(o.size),u=t.user.id,s={team:{id:r},user:{id:u}};o.nameFilter?.length&&(s.name=(0,L.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 Xt=h(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=y(t),o=await R.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=f(t),o=await E.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await R.save(R.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}=y(t),o=f(t);if(!(await R.update(r,o)).affected)throw new i(404,"Query not found");return{data:await R.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",config:{requireRole:S("editor")},handler:async t=>b.transaction(async()=>{let{id:r}=y(t);if(!(await R.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var Zt=e=>e&&le(e)?"CONTAINS":"=",Ue=(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("."),u=t(a,n);if(o.isAdvanced){let s=jt.parse(o.value);if(!s)throw new i(400,`Invalid value for '${o.column}': ${o.value}`);r.push({value:s.value,column:o.column,operator:s.operator||Zt(u?.type),fn:o.fn})}else r.push({value:o.value?[{value:o.value}]:[],column:o.column,operator:Zt(u?.type),fn:o.fn})}return r},er=e=>{let t=[e.table];return e.joins&&e.joins.forEach(({table:r})=>t.push(r)),t},_e=e=>({column:e.value,fn:e.fn,distinct:e.distinct}),tr=(e,t,r)=>{let o=[];return t.length>0||r.length>0?o.push(...t.map(_e),...r.map(_e)):e.length>0&&o.push(...e.map(_e)),o},Ko=e=>e.isPrimary&&e.table?.name?{table:e.table.name,field:e.name}:e?.meta?.refs,Vo=e=>e?.meta?.referencedBy,rr=(e,t,r)=>t.map((o,a)=>{let n=o.table?r(o.table,o.column):void 0,u=n?Ko(n):void 0,s=n?Vo(n):void 0;return{...o,full:e[a].fn?e[a].column:o.full,type:n?.type,fn:e[a].fn,ref:u,referencedBy:s}}),or=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"}),t.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 Le=require("typeorm"),ar=new Le.DataSource({type:"mysql"}),nr=new Le.DataSource({type:"postgres"}),j=e=>{switch(e){case"postgres":return nr.createQueryBuilder();case"mysql":return ar.createQueryBuilder();default:throw new Error("Unsupported database connection")}},pe={postgres:nr.driver,mysql:ar.driver};var Z=(e,t,r)=>{let{column:o,operator:a,value:n}=e,u="_"+t;switch(a){case"IS NULL":case"IS NOT NULL":return[`${o} ${a}`,{value:void 0}];case"IN":case"NOT IN":return[`${o} ${a} (:...${u})`,{[u]:n?.map(c=>c.value)}];case"LIKE":case"CONTAINS":return[`${o} ${r==="postgres"?"ILIKE":"LIKE"} :${u}`,{[u]:a==="CONTAINS"?`%${n?.[0].value}%`:n?.[0].value}];case"NOT LIKE":case"NOT CONTAINS":return[`${o} ${r==="postgres"?"NOT ILIKE":"NOT LIKE"} :${u}`,{[u]:a==="NOT CONTAINS"?`%${n?.[0].value}%`:n?.[0].value}];default:return[`${o} ${a} :${u}`,{[u]:n?.[0]?.value}]}};var sr=e=>{let t=pe[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 ir=["SUM","COUNT","AVG","MAX","MIN"],zo=["YEAR","MONTH","DAY",...ir],Jo=zo.reduce((e,t)=>(e[t]=!0,e),{}),Xo=ir.reduce((e,t)=>(e[t]=!0,e),{}),ur=e=>Jo[e],cr=e=>Xo[e];var fe=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,mr={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:fe,MAX:fe,MIN:fe,COUNT:fe};var ye=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,lr={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:ye,MAX:ye,MIN:ye,COUNT:ye};var Zo=e=>{let t=[];return e.fn&&t.push(e.fn),e.distinct&&t.push("distinct"),t.push(e.column),t.join(" ")},ea=e=>{let t=sr(e),r=e==="postgres"?mr:lr;return o=>o.fn&&ur(o.fn)?r[o.fn](t(o.column),o.fn,o.distinct):t(o.column)};function dr(e,t){let r=j(t.dbType).from(e,e),o=!1,a=0,n=ea(t.dbType),u={};return{setColumns(s){s.forEach(m=>{let c=Zo(m);u[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!!u[s]},build(){o||r.limit(50);let[s,m]=r.getQueryAndParameters();return{sql:s,params:m}}}}var pr=(e,t)=>{let r=j(t.dbType).update(e),o=0;return{addWhere(a){let[n,u]=Z(a,++o,t.dbType);r.andWhere(n,u)},setParams(a){let n={};for(let[u,s]of Object.entries(a)){let m=`${s}`;m.startsWith("=")?n[u]=()=>m.substring(1):n[u]=m}r.set(n)},build(){let[a,n]=r.getQueryAndParameters();return{sql:a,params:n}}}};var fr=(e,t)=>{let r=j(t.dbType).insert().into(e);return{setValues(o){let a={};for(let[n,u]of Object.entries(o)){let s=`${u}`;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 ke=dr,yr=pr,Tr=fr;var gr=require("typeorm"),hr=async(e,t)=>{let r=await ie.find({where:{table:{name:(0,gr.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 ta(e,t,r){return R.save(R.create({user:{id:e},team:{id:t},dataSource:{id:r.datasourceId},name:r.name,opts:r.opts}))}var Te=async(e,t)=>{let{datasourceId:r,size:o=20,page:a}=t,{table:n,joins:u,groupBy:s,orderBy:m}=t.opts,c=await ge(r);if(!c)throw new i(404,"Datasource not found");let l=tr(t.opts.columns,t.opts.groupBy,t.opts.aggregations),p=er(t.opts),d=await hr(r,p),N=d.getAllColumns(),k;l&&l.length>0?k=l:k=N.map(I=>({column:I.full})),k.forEach(I=>{if(!d.hasColumn(I.column))throw new i(400,`Invalid column ${I.column}`)});let eo=ta(e.user.id,e.user.currentTeamId,t),x=ke(n,c);x.setLimit(o+1),x.setOffset(o*a),x.setColumns(k),u&&u.forEach(x.addJoin),m.length>0&&m.forEach(({column:I,direction:so})=>{x.hasAlias(I)&&x.addOrderBy(pe[c.dbType].escape(I),so)}),s&&s.length>0&&s.forEach(I=>{d.hasColumn(I.value)&&x.addGroupBy({column:I.value,fn:I.fn,distinct:I.distinct})}),Ue(t.opts.filters,d.getColumnByName).forEach(I=>{I.fn&&cr(I.fn)?x.addHaving(I):x.addWhere(I)});let{sql:to,params:ro}=x.build(),te=await(await $(U(c,!0),c.dbType,e)).executeQuery({sql:to,params:ro,type:"SELECT",allowBulkUpdate:!1}),Be=te.rows.length>o;Be&&te.rows.pop();let{id:oo}=await eo,Fe=rr(k,te.columns,d.getColumnByName),{hooks:ao,entities:no}=or(Fe);return{...te,queryHistoryId:oo,tables:p,allColumns:N,availableHooks:ao,availableEntities:no,availableJoins:d.getAvailableJoins(),columns:Fe,hasMore:Be}},br=async(e,t)=>{let r=await ge(t.dataSourceId);if(!r)throw new i(400,"Invalid datasource");let o=await $(U(r,!0),r.dbType,e),a=ke(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:u}=a.build(),s=await o.executeQuery({sql:n,params:u,type:"SELECT",allowBulkUpdate:!1});if(s.rows.length>1)throw new i(400,"Found multiple rows for given query");if(s.rows.length<1)throw new i(404,"Entity not found");return{entity:s.rows[0],columns:s.columns,sql:n}},wr=async(e,t)=>{let r=await ge(t.datasourceId);if(!r)throw new i(404,"Data source not found");if(!r.allowUpdate)throw new i(403,"This datasource does not allow update operations");let o=yr(t.table,r);o.setParams(t.values),Ue(t.filters,()=>{}).forEach(s=>{o.addWhere(s)});let{sql:a,params:n}=o.build();return(await $(U(r,!0),r.dbType,e)).executeQuery({sql:a,params:n,type:"UPDATE",allowBulkUpdate:!1})},Sr=async(e,t)=>{let r=await ge(t.datasourceId);if(!r)throw new i(404,"Data source not found");if(!r.allowInsert)throw new i(403,"This datasource does not allow insert operations");let o=Tr(t.table,r);o.setValues(t.values);let{sql:a,params:n}=o.build();return(await $(U(r,!0),r.dbType,e)).executeQuery({sql:a,type:"INSERT",params:n,allowBulkUpdate:!1})};async function ge(e){return E.findOne({where:{id:e},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowUpdate","allowInsert"]})}var Er=e=>{},ra=["--",";","DROP","drop"],Ir=([e,t])=>{if(typeof t=="string"&&t.startsWith("=")){let r=t;ra.forEach(o=>{if(r.includes(o))throw new i(400,"Invalid input value for "+e)})}},Cr=e=>{if(!e.table)throw new i(400,"Table is required");Object.entries(e.values).forEach(Ir)},Rr=e=>{if(!e.table)throw new i(400,"Table is required");Object.entries(e.values).forEach(Ir)};var Nr=h(e=>{e.route({method:"post",url:"/:dsId/select",handler:async t=>{let r=f(t,Er);return{data:await Te(t,r)}}}),e.route({method:"get",url:"/:dsId/entity/:table",handler:async t=>{let{dsId:r,table:o}=y(t),a=v(t);return{data:await br(t,{table:o,dataSourceId:r,props:a})}}}),e.route({method:"post",url:"/:dsId/insert",config:{requireRole:S("editor")},handler:async t=>{let r=f(t,Cr);return{data:await Sr(t,r)}}}),e.route({method:"post",url:"/:dsId/update",config:{requireRole:S("editor")},handler:async t=>{let r=f(t,Rr);return{data:await wr(t,r)}}})});var Ar=h(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:T.str("SERVER_VERSION")}}))});var Pr=h(e=>{e.route({method:"get",url:"/:id/users",handler:async t=>{let{id:r}=y(t),o=await F.findOne({where:{id:r},relations:{users:{user:!0}}});if(!o)throw new i(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=f(t),a=w.create();a.id=r;let n=F.create(o);await F.save(n);let u=C.create({user:a,team:n});return await C.save(u),{data:n}})}),e.route({method:"patch",url:"/:id/user-role",config:{requireRole:S("admin")},handler:async t=>{let{id:r}=y(t),{role:o,userId:a}=f(t,({role:u})=>{if(u==="owner")throw new i(400,"Only one owner is allowed")});if((await C.findOneBy({user:{id:a},team:{id:r}}))?.role==="owner")throw new i(400,"Cannot change owner role");await C.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}=y(t),{userId:o}=v(t);if((await C.findOneBy({user:{id:o},team:{id:r}}))?.role==="owner")throw new i(400,"Cannot delete team owner");await w.update(o,{currentTeam:null}),await C.delete({user:{id:o},team:{id:r}}),await w.delete({id:o})})})});var qe=O(require("bcryptjs")),ee=async e=>{let t=await qe.default.genSalt(10);return qe.default.hash(e,t)};var Or=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 i(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=f(t);if(o.password&&(o.password=await ee(o.password)),!(await w.update(r,o)).affected)throw new i(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=f(t),o=await ee(r.password),a=await w.save(w.create({username:r.username,password:o})),n=await C.save(C.create({role:"read_only",team:{id:r.teamId},user:{id:a.id}}));await w.update(a.id,{currentTeam:{id:n.id}})})})});var Dr=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}=f(t);if(!r.id)throw new i(400,"Settings id is required!");if(!(await W.update(r.id,r)).affected)throw new i(404,"You do not own these settings!");return{data:await W.findOneBy({id:r.id})}}})});function K(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 xr=h(e=>{e.route({method:"post",url:"/",config:{requireRole:S("editor")},handler:async t=>{let r=f(t),o=await R.findOne({where:{id:r.queryId}});if(!o)throw new i(400,"Query not found");let a=await _.save(_.create({isPersonal:!1,team:{id:t.user.currentTeamId},user:{id:t.user.id},query:{id:r.queryId},searchString:K(o.opts,r.name)}));return await R.update(r.queryId,{name:r.name}),{data:a}}}),e.route({method:"delete",url:"/:id",config:{requireRole:S("editor")},handler:async t=>{let{id:r}=y(t);if(!(await _.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}=y(t),o=f(t,u=>{if(!u.name)throw new i(400,"Name is required")}),a=await _.findOne({where:{id:r},relations:{query:!0}});if(!a)throw new i(400,"Query not found");let n=K(a.query.opts,o.name);return await Promise.all([_.update({id:r},{searchString:n}),R.update({id:a.query.id},{name:o.name})]),{data:!0}})})});var vr=e=>{if(!e.queryId&&!(e.opts&&e.name))throw new i(400,"Either queryId or name and opts are required")};var _r=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}=y(t),{currentTeamId:o,id:a}=t.user,n=await A.findOne({where:{id:r,team:{id:o},user:{id:a}}});if(!n)throw new i(404,"Not Found");return{data:n}}}),e.route({method:"post",url:"/",handler:async t=>{let{opts:r,name:o,queryId:a}=f(t,vr),n,u,s=o;if(r)u=r.dataSourceId,n=r;else{let c=await R.findOne({where:{id:a},relations:{dataSource:!0}});if(!c)throw new i(404,"Query not Found");u=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:u},user:{id:t.user.id},team:{id:t.user.currentTeamId}}))}}}),e.route({method:"post",url:"/:id/run",handler:async t=>{let{id:r}=y(t),o=f(t),a=await A.findOne({where:{id:r},relations:{user:!0}});if(!a)throw new i(404,"Not found");if(a.user?.id!==t.user.id)throw new i(404,"Not found");return o&&A.update(r,{opts:o||{},searchString:K(o,a.name),updatedAt:new Date}),{data:{result:await Te(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}=y(t),o=f(t),a=await A.findOne({where:{id:r,user:{id:t.user.id}}});if(!a)throw new i(404,"Not Found");let n=a.searchString;return o.name&&(n=K(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}=y(t),o=t.user.id;return await A.delete({id:r,user:{id:o}}),{data:!0}}})});var kr=require("node:crypto");var Ur=require("node:crypto"),Lr={teamName:"Default Team",username:"admin"},oa=async()=>{let e=await F.findOneBy({});return e||F.save(F.create({name:Lr.teamName}))},he=async e=>{let t=await C.findOne({where:{role:"owner"},relations:{user:!0}});if(t)return t.user;let r=await oa(),o=await ee(e?.password||(0,Ur.randomBytes)(32).toString("hex")),a=await w.save(w.create({username:e?.name||Lr.username,password:o})),n=await C.save(C.create({user:a,team:r,role:"owner"}));return await w.update(a.id,{currentTeam:n}),a};var be={setupAccessToken:void 0},qr=()=>(be.setupAccessToken=(0,kr.randomBytes)(32).toString("hex"),be.setupAccessToken),aa=e=>{if(!be.setupAccessToken)throw new i(400,"Setup already performed");if(!e||e!==be.setupAccessToken)throw new i(400,"Invalid setup access token")},H=async()=>D.skipAuth?!1:await w.count()<1,Br=async e=>{aa(e.setupAccessToken),await he({name:e.userName,password:e.userPassword})};var Fr=h(e=>{e.route({method:"get",url:"/client.config.js",handler:(t,r)=>{let o={skipAuth:D.skipAuth,modeName:D.name,usesCustomDb:Ye(),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 Mr=e=>{if(!e.setupAccessToken)throw new i(400,"Invalid setup access token");if(!e.userPassword||e.userPassword.length<8)throw new i(400,"Password should be at least 8 chars long");if(!e.userName)throw new i(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 i(400,"Setup has already been completed");let o=f(t,Mr);return await Br(o),{data:!0}}})});var na=[[Fr,"/"],[ht,"/api/auth"],[zt,"/api/data-sources"],[Jt,"/api/project"],[Xt,"/api/queries"],[Nr,"/api/runner"],[Ar,"/api/status"],[Pr,"/api/teams"],[Or,"/api/users"],[Dr,"/api/user-settings"],[xr,"/api/saved-queries"],[_r,"/api/workbench-tabs"],[Qr,"/api/setup"]],$r=e=>{for(let[t,r]of na)e.register(t,{prefix:r}),console.log("Registered "+r)};var sa=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),ia=async()=>C.findOne({where:{role:"owner"},relations:{user:!0,team:!0}}),ua=async e=>{let t=await ia();if(!t)throw new i(401,"User is not part of a team");e.user={id:t.user.id,currentTeamId:t.team.id,currentTeamRole:t.role}},ca=async e=>{let t=e.headers.authorization;if(!t)throw new i(401,"Missing auth token");let[r,o]=t.split(" "),{userId:a}=await ft(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 i(401,"Unauthorized");e.user={id:a,currentTeamId:n.currentTeam.team.id,currentTeamRole:n.currentTeam.role}},Hr=async e=>{sa(e)||(D.skipAuth?await ua(e):await ca(e))};var Wr=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Yr=e=>{e.addHook("onRequest",Hr),e.addHook("onRequest",Kt),e.addHook("onResponse",Wr)};var Gr=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 i?o.status(t.status).send({error:t.message}):o.status(500).send({error:"Internal Server Error"})})};var jr=O(require("@fastify/cookie")),Kr=O(require("@fastify/cors"));var Vr=O(require("@fastify/static")),zr=require("node:path"),Jr=e=>{e.register(jr.default,{}),e.register(Kr.default,{origin:z.allowedOrigins,methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),e.register(Vr.default,{root:(0,zr.join)(__dirname,"web")})};(async function(){let t=(0,Xr.default)({querystringParser:o=>Zr.default.parse(o)});if(We(),Jr(t),Yr(t),$r(t),Gr(t),await t.after(),await it(),t.listen({port:z.port,host:z.host},(o,a)=>{o&&(console.error(o),process.exit(1)),console.log(`Server listening at ${a}`)}),await H()){let o=qr();console.log(`Setup access token:
|
|
58
58
|
${o}`),console.log("Use the above token to finish the setup process when opening the app for the first time.")}else await he()})();
|