New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details
Socket
Book a DemoSign in
Socket

@dataramen/cli

Package Overview
Dependencies
Maintainers
1
Versions
159
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@dataramen/cli - npm Package Compare versions

Comparing version
0.0.76-beta.1
to
0.0.76
+4
-4
dist/code/server.js

@@ -1,2 +0,2 @@

"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=`
"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 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 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 re=te(fo(process.argv.slice(2)));var yo=(()=>{try{let e=(0,$e.readFileSync)((0,ae.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})(),He=[],Qe=re.str("env");Qe&&He.push((0,ae.resolve)(Qe));(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: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=te(process.env),Ye=()=>T.str("APP_DB_TYPE")!==we.APP_DB_TYPE&&T.str("APP_DB_DATABASE")!==we.APP_DB_DATABASE;var qm=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=re.str("mode","default"),D=go[ho];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 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 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:"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(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,K,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(K),_=b.getRepository(Re),A=b.getRepository(Ne),se=b.getRepository(q),ie=b.getRepository(B);var ut=T.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),ct=T.num("PORT",4466),V={port:ct,host:D.bindServerUrl,allowedOrigins:ut.includes("*")?"*":[`http://localhost:${ct}`,...ut]};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 mt=new TextEncoder,lt=mt.encode(T.str("JWT_SECRET")),dt=mt.encode(T.str("JWT_REFRESH_SECRET")),Ae=async({userId:e})=>new z.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign(lt),Pe=async({userId:e})=>new z.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign(dt),pt=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")}},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 J(e){if(e!==void 0)return e.toLowerCase()}var Eo=({database:e,password:t,user:r,url:o})=>Et.default.createConnection({host:ne(o),user:r,database:e,password:t,dateStrings:!0}),Io=async e=>{let t=`
SELECT LOWER(TABLE_NAME) as TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION

@@ -6,3 +6,3 @@ FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE

ORDER BY TABLE_NAME, ORDINAL_POSITION;
`,[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=`
`,[r]=await e.execute(t),o={};return r.forEach(a=>{let n=J(a.TABLE_NAME),u=a.COLUMN_NAME;o[n]||(o[n]=[]),o[n].push(u)}),o},Co=async e=>{let t=`
SELECT

@@ -18,3 +18,3 @@ LOWER(TABLE_NAME) AS table_name,

AND CONSTRAINT_SCHEMA = DATABASE();
`,[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(`
`,[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=J(Object.values(s)[0]),c=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${e.database}' and LOWER(table_name) = '${m}'`,[l]=await t.query(c),p=a[m];return{columns:l.map(d=>({name:d.COLUMN_NAME,type:d.DATA_TYPE,isPrimary:n[m]?.includes(d.COLUMN_NAME),ref:p?.[d.COLUMN_NAME]?{table:p[d.COLUMN_NAME].refTable,field:p[d.COLUMN_NAME].refField}:void 0})),createdAt:new Date,tableName:m,updatedAt:new Date}});return Promise.all(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:J(m.orgTable),alias:m.name,full:m.orgTable?J(m.orgTable)+"."+m.orgName:m.name}))||[],rows:s,query:e}}throw new Error(`[MYSQL CONN] Unknown result type: ${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:ne(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(`
SELECT

@@ -59,3 +59,3 @@ LOWER(kcu.table_name) as table_name,

concat(pg_class.oid, '-', attnum) IN (${e.join(", ")})
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:
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),{}),Y=e=>e.map(t=>({label:Bo[t],value:t})),gs=Y(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),hs=Y(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL","CONTAINS","NOT CONTAINS"]),bs=Y(["=","<>","IS NULL","IS NOT NULL"]),ws=Y(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),Ss=Y(["IS NULL","IS NOT NULL"]),Es=Y(["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,{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(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(K,{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 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 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([ie.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"}),G=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 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 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=G(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]=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 pr=(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 fr=(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 ke=dr,yr=pr,Tr=fr;var gr=require("typeorm"),hr=async(e,t)=>{let r=await se.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(),ee=await(await $(U(c,!0),c.dbType,e)).executeQuery({sql:to,params:ro,type:"SELECT",allowBulkUpdate:!1}),Be=ee.rows.length>o;Be&&ee.rows.pop();let{id:oo}=await eo,Fe=rr(k,ee.columns,d.getColumnByName),{hooks:ao,entities:no}=or(Fe);return{...ee,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")),Z=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 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 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 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 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: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 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: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 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 Z(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:V.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:V.port,host:V.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:
${o}`),console.log("Use the above token to finish the setup process when opening the app for the first time.")}else await he()})();

@@ -1,1 +0,1 @@

{"name":"@dataramen/server","version":"0.0.100","license":"MIT","main":"code/server.js","dependencies":{"@fastify/cors":"^11.0.1","@fastify/static":"^8.2.0","@fastify/cookie":"^11.0.2","dotenv":"^16.5.0","fast-glob":"^3.3.3","fastify":"^5.3.2","mysql2":"^3.14.1","pg":"^8.15.6","sqlite3":"^5.1.7","typeorm":"^0.3.27","bcryptjs":"^3.0.2","jose":"^6.0.12","reflect-metadata":"^0.2.2","qs":"^6.14.0","uuid":"^13.0.0"},"buildToken":"711ed441f59c1b00d923","devDependencies":{"fs-extra":"^11.3.0","open":"^10.2.0","commander":"^14.0.2","yocto-spinner":"^1.0.0"}}
{"name":"@dataramen/server","version":"0.0.100","license":"MIT","main":"code/server.js","dependencies":{"@fastify/cors":"^11.0.1","@fastify/static":"^8.2.0","@fastify/cookie":"^11.0.2","dotenv":"^16.5.0","fast-glob":"^3.3.3","fastify":"^5.3.2","mysql2":"^3.14.1","pg":"^8.15.6","sqlite3":"^5.1.7","typeorm":"^0.3.27","bcryptjs":"^3.0.2","jose":"^6.0.12","reflect-metadata":"^0.2.2","qs":"^6.14.0","uuid":"^13.0.0"},"buildToken":"45f7b7f0c1dff83f6544","devDependencies":{"fs-extra":"^11.3.0","open":"^10.2.0","commander":"^14.0.2","yocto-spinner":"^1.0.0"}}
{
"name": "@dataramen/cli",
"version": "0.0.76-beta.1",
"version": "0.0.76",
"repository": "https://github.com/OleksandrDemian/dataramen.git",

@@ -5,0 +5,0 @@ "author": "Oleksandr Demian <oleksandrovsky@gmail.com>",