@dataramen/cli 0.0.70 → 0.0.71-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
- "use strict";var Qr=Object.create;var $e=Object.defineProperty;var $r=Object.getOwnPropertyDescriptor;var Br=Object.getOwnPropertyNames;var Wr=Object.getPrototypeOf,Hr=Object.prototype.hasOwnProperty;var Yr=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of Br(t))!Hr.call(e,a)&&a!==r&&$e(e,a,{get:()=>t[a],enumerable:!(o=$r(t,a))||o.enumerable});return e};var v=(e,t,r)=>(r=e!=null?Qr(Wr(e)):{},Yr(t||!e||!e.__esModule?$e(r,"default",{value:e,enumerable:!0}):r,e));var ae=require("dotenv"),ne=require("node:path"),We=require("node:fs");var re=e=>{function t(a,n=void 0){return e[a]||n}function r(a,n=void 0){let i=e[a];if(!i)return n;let u=Number(i);return!isNaN(u)&&i.trim()!==""?u:n}function o(a){return e[a]==="true"||e[a]==="TRUE"||e[a]==="1"}return{str:t,num:r,bool:o}};function jr(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(jr(process.argv.slice(2)));var Gr=(()=>{try{let e=(0,We.readFileSync)((0,ne.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})(),He=[],Be=oe.str("env");Be&&He.push((0,ne.resolve)(Be));(0,ae.config)({path:He});var Se={APP_DB_TYPE:"sqlite",APP_DB_DATABASE:"<home>/.dataramen/.runtime/db.sqlite3"};(0,ae.populate)(process.env,{SERVER_VERSION:Gr.version,PROD:"true",...Se},{override:!1});var Kr=["SYMM_ENCRYPTION_KEY","JWT_SECRET","JWT_REFRESH_SECRET"],Ye=()=>{let e=[];for(let t of Kr)process.env[t]||e.push(t);if(e.length>0)throw new Error("Following env variables are required but not provided: "+e.join(", "))},y=re(process.env),je=()=>y.str("APP_DB_TYPE")!==Se.APP_DB_TYPE&&y.str("APP_DB_DATABASE")!==Se.APP_DB_DATABASE;var fc=require("reflect-metadata"),Mr=v(require("fastify")),kr=v(require("qs"));var rt=require("typeorm");var Ge=require("typeorm");var Vr={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"}},zr=oe.str("mode","default"),_=Vr[zr];var h=y.str("APP_DB_TYPE")==="sqlite"?"datetime":"timestamp",se=_.name==="docker"?e=>e==="localhost"||e==="127.0.0.1"?"host.docker.internal":e:e=>e;var Ee=new Ge.EntitySchema({name:"DatabaseInspection",tableName:"db_inspection",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},tableName:{nullable:!0,type:String},columns:{type:"json",nullable:!0},createdAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,default:()=>"CURRENT_TIMESTAMP"}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var Ke=require("typeorm");var Re=new Ke.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,default:()=>"CURRENT_TIMESTAMP"}},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 Ve=require("typeorm");var be=new Ve.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},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 ze=require("typeorm");var Ie=new ze.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,default:()=>"CURRENT_TIMESTAMP"}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var Je=require("typeorm");var Ne=new Je.EntitySchema({name:"DataSource",tableName:"data_sources",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},dbUrl:{type:String},dbPort:{type:Number,nullable:!0},dbUser:{type:String},dbPassword:{type:String,nullable:!0,select:!1},dbPasswordIv:{type:String,nullable:!0,select:!1},dbPasswordTag:{type:String,nullable:!0,select:!1},dbType:{type:String},createdAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},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:h,nullable:!0,default:null},status:{type:String,nullable:!0}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"datasources",joinColumn:!0},inspections:{type:"one-to-many",target:()=>"DatabaseInspection",inverseSide:"datasource"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"dataSource"},owner:{type:"many-to-one",target:()=>"User",joinColumn:!0}}});var ot=v(require("node:os")),at=require("node:path");var Xe=require("typeorm");var Ce=new Xe.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",default:"{}"},createdAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},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 Ze=require("typeorm"),Ae=new Ze.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 et=require("typeorm");var Pe=new et.EntitySchema({name:"SavedQuery",tableName:"saved_queries",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},isPersonal:{type:Boolean},createdAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"},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 tt=require("typeorm");var Oe=new tt.EntitySchema({name:"WorkbenchTab",tableName:"workbench_tabs",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"},opts:{type:"json",default:"{}"},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}}});function Jr(){let e=y.str("APP_DB_DATABASE");if(!e)throw new Error("Bad value for TYPEORM_DATABASE. Please check your config!");return e.startsWith("<home>")&&(e=e.replace("<home>",ot.default.homedir())),e}var w=new rt.DataSource({type:y.str("APP_DB_TYPE"),database:Jr(),host:y.str("APP_DB_HOST"),username:y.str("APP_DB_USERNAME"),password:y.str("APP_DB_PASSWORD"),port:y.num("APP_DB_PORT"),schema:y.str("APP_DB_SCHEMA"),logging:y.bool("APP_DB_LOGGING"),migrationsRun:!0,migrations:[at.posix.join(__dirname,"migrations","*.js")],entities:[Ee,Ne,Re,be,Ae,Ie,Ce,Pe,Oe]}),nt=async()=>{if(!w.isInitialized)return w.initialize();throw new Error("Already initialized")},U=w.getRepository(Ee),b=w.getRepository(Ne),k=w.getRepository(Re),S=w.getRepository(be),C=w.getRepository(Ae),W=w.getRepository(Ie),I=w.getRepository(Ce),x=w.getRepository(Pe),A=w.getRepository(Oe);var st=y.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),it=y.num("PORT",4466),j={port:it,host:_.bindServerUrl,allowedOrigins:st.includes("*")?"*":[`http://localhost:${it}`,...st]};var g=e=>(t,r,o)=>{e(t),o()};var G=require("jose");var s=class extends Error{constructor(r,o){super(o);this.status=r;this.message=o}};var ut=new TextEncoder,ct=ut.encode(y.str("JWT_SECRET")),lt=ut.encode(y.str("JWT_REFRESH_SECRET")),ve=async({userId:e})=>new G.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign(ct),_e=async({userId:e})=>new G.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign(lt),mt=async(e,t)=>{try{let{payload:r}=await(0,G.jwtVerify)(e,t);if(!r.sub)throw new s(401,"Failed to verify access token");return{userId:r.sub}}catch(r){throw r instanceof s?r:r instanceof Error?new s(401,r.message):new s(401,"Failed to verify refresh token")}},dt=async e=>mt(e,ct),pt=async e=>mt(e,lt);var f=(e,t)=>{let r=e.body;return t&&t(r),r},L=(e,t)=>{let r=e.query;return t&&t(r),r},d=(e,t)=>{let r=e.params;return t&&t(r),r};var yt=v(require("bcryptjs"));var ft=e=>{if(!e?.username)throw new s(400,"Username is required");if(!e?.password)throw new s(400,"Password is required")};var ie="DATARAMEN_refresh_token",De={httpOnly:!0,secure:y.bool("PROD"),sameSite:y.bool("PROD"),path:"/",maxAge:14400*60},Tt=g(e=>{e.route({method:"post",url:"/login",config:{isPublic:!0},handler:async(t,r)=>{let{username:o,password:a}=f(t,ft),n=await S.findOne({where:{username:o}});if(!n||!yt.default.compareSync(a,n.password))throw new s(401,"Invalid credentials");let[i,u]=await Promise.all([ve({userId:n?.id}),_e({userId:n?.id})]);return r.setCookie(ie,u,De),{data:{accessToken:i}}}}),e.route({method:"post",url:"/refresh",config:{isPublic:!0},handler:async(t,r)=>{let o=t.cookies[ie];if(!o)return r.code(401).send({message:"Missing refresh token"});let{userId:a}=await pt(o),[n,i]=await Promise.all([ve({userId:a}),_e({userId:a})]);return r.setCookie(ie,i,De),{data:{accessToken:n}}}}),e.route({method:"post",url:"/logout",config:{isPublic:!0},handler:async(t,r)=>(r.clearCookie(ie,De),{data:!0})})});var gt=e=>{if(!e.dbUrl)throw new s(400,"url is required");if(!e.dbUser)throw new s(400,"user is required");if(!e.dbType)throw new s(400,"type is required");if(!e.name)throw new s(400,"name is required");if(!e.dbDatabase)throw new s(400,"database is required")};var wt=v(require("mysql2/promise"));function K(e){if(e!==void 0)return e.toLowerCase()}var Xr=({database:e,password:t,user:r,url:o})=>wt.default.createConnection({host:se(o),user:r,database:e,password:t}),Zr=async e=>{let t=`
1
+ "use strict";var Vr=Object.create;var Ue=Object.defineProperty;var zr=Object.getOwnPropertyDescriptor;var Jr=Object.getOwnPropertyNames;var Xr=Object.getPrototypeOf,Zr=Object.prototype.hasOwnProperty;var eo=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of Jr(t))!Zr.call(e,a)&&a!==r&&Ue(e,a,{get:()=>t[a],enumerable:!(o=zr(t,a))||o.enumerable});return e};var O=(e,t,r)=>(r=e!=null?Vr(Xr(e)):{},eo(t||!e||!e.__esModule?Ue(r,"default",{value:e,enumerable:!0}):r,e));var ee=require("dotenv"),te=require("node:path"),qe=require("node:fs");var X=e=>{function t(a,n=void 0){return e[a]||n}function r(a,n=void 0){let s=e[a];if(!s)return n;let u=Number(s);return!isNaN(u)&&s.trim()!==""?u:n}function o(a){return e[a]==="true"||e[a]==="TRUE"||e[a]==="1"}return{str:t,num:r,bool:o}};function to(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 Z=X(to(process.argv.slice(2)));var ro=(()=>{try{let e=(0,qe.readFileSync)((0,te.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})(),Me=[],Le=Z.str("env");Le&&Me.push((0,te.resolve)(Le));(0,ee.config)({path:Me});var fe={APP_DB_TYPE:"sqlite",APP_DB_DATABASE:"<home>/.dataramen/.runtime/db.sqlite3"};(0,ee.populate)(process.env,{SERVER_VERSION:ro.version,PROD:"true",...fe},{override:!1});var oo=["SYMM_ENCRYPTION_KEY","JWT_SECRET","JWT_REFRESH_SECRET"],ke=()=>{let e=[];for(let t of oo)process.env[t]||e.push(t);if(e.length>0)throw new Error("Following env variables are required but not provided: "+e.join(", "))},y=X(process.env),Qe=()=>y.str("APP_DB_TYPE")!==fe.APP_DB_TYPE&&y.str("APP_DB_DATABASE")!==fe.APP_DB_DATABASE;var Yc=require("reflect-metadata"),$r=O(require("fastify")),Wr=O(require("qs"));var Ve=require("typeorm");var Be=require("typeorm");var ao={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"}},no=Z.str("mode","default"),_=ao[no];var g=y.str("APP_DB_TYPE")==="sqlite"?"datetime":"timestamp",re=_.name==="docker"?e=>e==="localhost"||e==="127.0.0.1"?"host.docker.internal":e:e=>e;var ye=new Be.EntitySchema({name:"DatabaseInspection",tableName:"db_inspection",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},tableName:{nullable:!0,type:String},columns:{type:"json",nullable:!0},createdAt:{type:g,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:g,default:()=>"CURRENT_TIMESTAMP"}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var Fe=require("typeorm");var Te=new Fe.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:g,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:g,default:()=>"CURRENT_TIMESTAMP"}},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 $e=require("typeorm");var ge=new $e.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:g,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:g,default:()=>"CURRENT_TIMESTAMP"},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 We=require("typeorm");var he=new We.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:g,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:g,default:()=>"CURRENT_TIMESTAMP"}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var He=require("typeorm");var we=new He.EntitySchema({name:"DataSource",tableName:"data_sources",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},dbUrl:{type:String},dbPort:{type:Number,nullable:!0},dbUser:{type:String},dbPassword:{type:String,nullable:!0,select:!1},dbPasswordIv:{type:String,nullable:!0,select:!1},dbPasswordTag:{type:String,nullable:!0,select:!1},dbType:{type:String},createdAt:{type:g,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:g,default:()=>"CURRENT_TIMESTAMP"},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},inspections:{type:"one-to-many",target:()=>"DatabaseInspection",inverseSide:"datasource"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"dataSource"},owner:{type:"many-to-one",target:()=>"User",joinColumn:!0}}});var ze=O(require("node:os")),Je=require("node:path");var Ye=require("typeorm");var Se=new Ye.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",default:"{}"},createdAt:{type:g,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:g,default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},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 Ge=require("typeorm"),Ee=new Ge.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 Ke=require("typeorm");var Ie=new Ke.EntitySchema({name:"SavedQuery",tableName:"saved_queries",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},isPersonal:{type:Boolean},createdAt:{type:g,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:g,default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"},searchString:{type:String,default:()=>null}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"queries",joinColumn:!0},user:{type:"many-to-one",target:()=>"User",inverseSide:"queries",joinColumn:!0,nullable:!0},query:{type:"one-to-one",target:()=>"Query",joinColumn:!0,nullable:!1}}});var je=require("typeorm");var be=new je.EntitySchema({name:"WorkbenchTab",tableName:"workbench_tabs",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:g,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:g,default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"},opts:{type:"json",default:"{}"},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}}});function so(){let e=y.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>",ze.default.homedir())),e}var h=new Ve.DataSource({type:y.str("APP_DB_TYPE"),database:so(),host:y.str("APP_DB_HOST"),username:y.str("APP_DB_USERNAME"),password:y.str("APP_DB_PASSWORD"),port:y.num("APP_DB_PORT"),schema:y.str("APP_DB_SCHEMA"),logging:y.bool("APP_DB_LOGGING"),migrationsRun:!0,migrations:[Je.posix.join(__dirname,"migrations","*.js")],entities:[ye,we,Te,ge,Ee,he,Se,Ie,be]}),Xe=async()=>{if(!h.isInitialized)return h.initialize();throw new Error("Already initialized")},v=h.getRepository(ye),I=h.getRepository(we),q=h.getRepository(Te),w=h.getRepository(ge),N=h.getRepository(Ee),$=h.getRepository(he),b=h.getRepository(Se),D=h.getRepository(Ie),A=h.getRepository(be);var Ze=y.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),et=y.num("PORT",4466),G={port:et,host:_.bindServerUrl,allowedOrigins:Ze.includes("*")?"*":[`http://localhost:${et}`,...Ze]};var T=e=>(t,r,o)=>{e(t),o()};var K=require("jose");var i=class extends Error{constructor(r,o){super(o);this.status=r;this.message=o}};var tt=new TextEncoder,rt=tt.encode(y.str("JWT_SECRET")),ot=tt.encode(y.str("JWT_REFRESH_SECRET")),Re=async({userId:e})=>new K.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign(rt),Ce=async({userId:e})=>new K.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign(ot),at=async(e,t)=>{try{let{payload:r}=await(0,K.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")}},nt=async e=>at(e,rt),st=async e=>at(e,ot);var f=(e,t)=>{let r=e.body;return t&&t(r),r},U=(e,t)=>{let r=e.query;return t&&t(r),r},d=(e,t)=>{let r=e.params;return t&&t(r),r};var ut=O(require("bcryptjs"));var it=e=>{if(!e?.username)throw new i(400,"Username is required");if(!e?.password)throw new i(400,"Password is required")};var oe="DATARAMEN_refresh_token",Ne={httpOnly:!0,secure:y.bool("PROD"),sameSite:y.bool("PROD"),path:"/",maxAge:14400*60},ct=T(e=>{e.route({method:"post",url:"/login",config:{isPublic:!0},handler:async(t,r)=>{let{username:o,password:a}=f(t,it),n=await w.findOne({where:{username:o}});if(!n||!ut.default.compareSync(a,n.password))throw new i(401,"Invalid credentials");let[s,u]=await Promise.all([Re({userId:n?.id}),Ce({userId:n?.id})]);return r.setCookie(oe,u,Ne),{data:{accessToken:s}}}}),e.route({method:"post",url:"/refresh",config:{isPublic:!0},handler:async(t,r)=>{let o=t.cookies[oe];if(!o)return r.code(401).send({message:"Missing refresh token"});let{userId:a}=await st(o),[n,s]=await Promise.all([Re({userId:a}),Ce({userId:a})]);return r.setCookie(oe,s,Ne),{data:{accessToken:n}}}}),e.route({method:"post",url:"/logout",config:{isPublic:!0},handler:async(t,r)=>(r.clearCookie(oe,Ne),{data:!0})})});var mt=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 pt=O(require("mysql2/promise"));function j(e){if(e!==void 0)return e.toLowerCase()}var io=({database:e,password:t,user:r,url:o})=>pt.default.createConnection({host:re(o),user:r,database:e,password:t,dateStrings:!0}),uo=async e=>{let t=`
2
2
  SELECT LOWER(TABLE_NAME) as TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION
3
3
  FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
4
4
  WHERE CONSTRAINT_NAME = 'PRIMARY'
5
5
  ORDER BY TABLE_NAME, ORDINAL_POSITION;
6
- `,[r]=await e.execute(t),o={};return r.forEach(a=>{let n=K(a.TABLE_NAME),i=a.COLUMN_NAME;o[n]||(o[n]=[]),o[n].push(i)}),o},eo=async e=>{let t=`
6
+ `,[r]=await e.execute(t),o={};return r.forEach(a=>{let n=j(a.TABLE_NAME),s=a.COLUMN_NAME;o[n]||(o[n]=[]),o[n].push(s)}),o},co=async e=>{let t=`
7
7
  SELECT
8
8
  LOWER(TABLE_NAME) AS table_name,
9
9
  COLUMN_NAME AS field,
@@ -14,7 +14,7 @@
14
14
  WHERE
15
15
  REFERENCED_TABLE_NAME IS NOT NULL
16
16
  AND CONSTRAINT_SCHEMA = DATABASE();
17
- `,[r]=await e.execute(t),o={};return Array.isArray(r)&&r.forEach(a=>{o[a.table_name]||(o[a.table_name]={}),o[a.table_name][a.field]={refTable:a.referenced_table,refField:a.referenced_field}}),o},to=async(e,t)=>{let o=(await t.query("SHOW TABLES"))[0],a=await eo(t),n=await Zr(t),i=o.map(async u=>{let m=K(Object.values(u)[0]),c=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${e.database}' and LOWER(table_name) = '${m}'`,[E]=await t.query(c),p=a[m];return{columns:E.map(l=>({name:l.COLUMN_NAME,type:l.DATA_TYPE,isPrimary:n[m]?.includes(l.COLUMN_NAME),ref:p?.[l.COLUMN_NAME]?{table:p[l.COLUMN_NAME].refTable,field:p[l.COLUMN_NAME].refField}:void 0})).sort((l,N)=>l.isPrimary&&N.isPrimary?l.name.localeCompare(N.name):l.isPrimary?-1:1),createdAt:new Date,tableName:m,updatedAt:new Date}});return Promise.all(i)},ht=async(e,t,r)=>{try{console.log(`[MYSQL CONN] Query: ${e}`);let[o,a]=await t.query({sql:e,rowsAsArray:!0}),n=o?.constructor?.name;if(n==="ResultSetHeader"){let i=o;if(i.affectedRows>1&&r.allowBulkUpdate!==!0)throw new Error("[MYSQL CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[i.affectedRows]],query:e}}else if(n==="Array"){let i=o;return{columns:a?.map(u=>({column:u.orgName||u.name,table:K(u.orgTable),alias:u.name,full:u.orgTable?K(u.orgTable)+"."+u.orgName:u.name}))||[],rows:i,query:e}}throw new Error(`[MYSQL CONN] Unknown result type: ${n}`)}catch(o){throw console.error(o),o instanceof s?o:new s(400,o.message)}},ro=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}},oo=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}},St=async e=>{let t=await Xr(e),r=!1;return{dbType:"mysql",dataSource:e,inspectSchema:()=>to(e,t),executeQuery:(o,a)=>a.type==="SELECT"?oo(t,()=>ht(o,t,a)):ro(t,()=>ht(o,t,a)),checkConnection:async()=>t.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.destroy()}}};var Rt=v(require("pg"));var ao=async({database:e,password:t,user:r,url:o,port:a})=>{let n=new Rt.default.Client({host:se(o),user:r,database:e,password:t,port:a,query_timeout:1e4});return await n.connect(),n},no=async e=>{let r=await e.query(`
17
+ `,[r]=await e.execute(t),o={};return Array.isArray(r)&&r.forEach(a=>{o[a.table_name]||(o[a.table_name]={}),o[a.table_name][a.field]={refTable:a.referenced_table,refField:a.referenced_field}}),o},mo=async(e,t)=>{let o=(await t.query("SHOW TABLES"))[0],a=await co(t),n=await uo(t),s=o.map(async u=>{let m=j(Object.values(u)[0]),c=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${e.database}' and LOWER(table_name) = '${m}'`,[S]=await t.query(c),p=a[m];return{columns:S.map(l=>({name:l.COLUMN_NAME,type:l.DATA_TYPE,isPrimary:n[m]?.includes(l.COLUMN_NAME),ref:p?.[l.COLUMN_NAME]?{table:p[l.COLUMN_NAME].refTable,field:p[l.COLUMN_NAME].refField}:void 0})).sort((l,C)=>l.isPrimary&&C.isPrimary?l.name.localeCompare(C.name):l.isPrimary?-1:1),createdAt:new Date,tableName:m,updatedAt:new Date}});return Promise.all(s)},lt=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}),s=a?.constructor?.name;if(s==="ResultSetHeader"){let u=a;if(u.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:[[u.affectedRows]],query:e}}else if(s==="Array"){let u=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:u,query:e}}throw new Error(`[MYSQL CONN] Unknown result type: ${s}`)}catch(a){throw console.error(a),a instanceof i?a:new i(400,a.message)}},lo=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}},po=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}},ft=async e=>{let t=await io(e),r=!1;return{dbType:"mysql",dataSource:e,inspectSchema:()=>mo(e,t),executeQuery:o=>o.type==="SELECT"?po(t,()=>lt(o.sql,o.params,t,o)):lo(t,()=>lt(o.sql,o.params,t,o)),checkConnection:async()=>t.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.destroy()}}};var Tt=O(require("pg"));var fo=async({database:e,password:t,user:r,url:o,port:a})=>{let n=new Tt.default.Client({host:re(o),user:r,database:e,password:t,port:a,query_timeout:1e4});return await n.connect(),n},yo=async e=>{let r=await e.query(`
18
18
  SELECT
19
19
  LOWER(kcu.table_name) as table_name,
20
20
  kcu.column_name,
@@ -28,7 +28,7 @@
28
28
  tc.constraint_type = 'PRIMARY KEY'
29
29
  ORDER BY
30
30
  table_name, kcu.ordinal_position;
31
- `),o={};return r.rows.forEach(a=>{let n=a.table_name,i=a.column_name;o[n]||(o[n]=[]),o[n].push(i)}),o},so=async e=>{let r=await e.query(`
31
+ `),o={};return r.rows.forEach(a=>{let n=a.table_name,s=a.column_name;o[n]||(o[n]=[]),o[n].push(s)}),o},To=async e=>{let r=await e.query(`
32
32
  SELECT
33
33
  LOWER(tc.table_name) AS table_name,
34
34
  kcu.column_name AS field,
@@ -43,16 +43,16 @@
43
43
  ON ccu.constraint_name = tc.constraint_name
44
44
  AND ccu.table_schema = tc.table_schema
45
45
  WHERE tc.constraint_type = 'FOREIGN KEY';
46
- `),o={};return r.rows.forEach(a=>{o[a.table_name]||(o[a.table_name]={}),o[a.table_name][a.field]={refTable:a.referenced_table,refField:a.referenced_field}}),o},io=async(e,t)=>{let r=`SELECT LOWER(tablename) as tablename FROM pg_catalog.pg_tables WHERE schemaname = '${e.schema}'`,a=(await t.query(r)).rows,n=await so(t),i=await no(t),u=a.map(async m=>{let c=Object.values(m)[0],E=`
46
+ `),o={};return r.rows.forEach(a=>{o[a.table_name]||(o[a.table_name]={}),o[a.table_name][a.field]={refTable:a.referenced_table,refField:a.referenced_field}}),o},go=async(e,t)=>{let r=`SELECT LOWER(tablename) as tablename FROM pg_catalog.pg_tables WHERE schemaname = '${e.schema}'`,a=(await t.query(r)).rows,n=await To(t),s=await yo(t),u=a.map(async m=>{let c=Object.values(m)[0],S=`
47
47
  SELECT column_name, data_type
48
48
  FROM information_schema.columns
49
49
  WHERE
50
50
  LOWER(table_name) = '${c}' and
51
51
  table_schema = '${e.schema}'
52
- `,{rows:p}=await t.query(E),l=n[c];return{columns:p.map(N=>({name:N.column_name,type:N.data_type,isPrimary:i[c]?.includes(N.column_name),ref:l?.[N.column_name]?{table:l[N.column_name].refTable,field:l[N.column_name].refField}:void 0})).sort((N,M)=>N.isPrimary&&M.isPrimary?N.name.localeCompare(M.name):N.isPrimary?-1:1),createdAt:new Date,tableName:c,updatedAt:new Date}});return Promise.all(u)},uo=async(e,t)=>{let r=`select LOWER(relname) as relname, attname, concat(pg_class.oid, '-', attnum) as row_key
52
+ `,{rows:p}=await t.query(S),l=n[c];return{columns:p.map(C=>({name:C.column_name,type:C.data_type,isPrimary:s[c]?.includes(C.column_name),ref:l?.[C.column_name]?{table:l[C.column_name].refTable,field:l[C.column_name].refField}:void 0})).sort((C,L)=>C.isPrimary&&L.isPrimary?C.name.localeCompare(L.name):C.isPrimary?-1:1),createdAt:new Date,tableName:c,updatedAt:new Date}});return Promise.all(u)},ho=async(e,t)=>{let r=`select LOWER(relname) as relname, attname, concat(pg_class.oid, '-', attnum) as row_key
53
53
  from pg_attribute
54
54
  left join pg_class on pg_attribute.attrelid = pg_class.oid
55
55
  where
56
56
  concat(pg_class.oid, '-', attnum) IN (${e.join(", ")})
57
- limit 75;`;return(await t.query(r)).rows.reduce((a,n)=>(a[n.row_key]={table:n.relname,column:n.attname},a),{})},Et=async(e,t,r)=>{try{console.log(`[PG CONN] Query: ${e}`);let{rows:o,fields:a,command:n,rowCount:i}=await t.query({text:e,rowMode:"array"});if(n==="UPDATE"||n==="INSERT"||n==="DELETE"){if(i!=null&&i>1&&r.allowBulkUpdate!==!0)throw new Error("[PG CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[i]],query:e}}if(n==="SELECT"){let u=a.map(c=>`'${c.tableID}-${c.columnID}'`),m=await uo(u,t);return{columns:a.map(c=>{let E=m[`${c.tableID}-${c.columnID}`];return{column:E?.column||c.name,alias:c.name,table:E?.table||"",full:E?E.table+"."+E.column:c.name}}),rows:o,query:e}}throw new Error(`[PG CONN] Unsupported command: ${n}`)}catch(o){throw o instanceof s?o:new s(400,o.message)}},co=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}},lo=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}},bt=async e=>{let t=await ao(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:()=>io(e,t),executeQuery:(n,i)=>a(()=>i.type==="SELECT"?lo(t,()=>Et(n,t,i)):co(t,()=>Et(n,t,i))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.end()}}};var q=async(e,t,r)=>{try{let o;if(t==="mysql")o=await St(e);else if(t==="postgres")o=await bt(e);else throw new s(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 s?o:o?.code==="ECONNREFUSED"?new s(500,"Failed to connect to the database"):new s(500,o.message)}};var ue=v(require("node:crypto"));var It="aes-256-gcm",mo=12,Nt=()=>{let e=y.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},po=e=>{let t=ue.default.randomBytes(mo),r=Nt(),o=ue.default.createCipheriv(It,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")}},fo=({encrypted:e,iv:t,tag:r})=>{let o=Nt(),a=ue.default.createDecipheriv(It,o,Buffer.from(t,"hex"));a.setAuthTag(Buffer.from(r,"hex"));let n=a.update(e,"hex","utf8");return n+=a.final("utf8"),n},ce={encrypt:po,decrypt:fo};var F=(e,t=!1)=>{if(t){let r=ce.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 Ct=[{value:"=",label:"equals"},{value:"<>",label:"not equal"},{value:">",label:"greater than"},{value:">=",label:"greater than or equal"},{value:"<",label:"less than"},{value:"<=",label:"less than or equal"},{value:"LIKE",label:"contains"},{value:"NOT LIKE",label:"not contains"},{value:"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"}],yo=Ct.reduce((e,t)=>(e[t.value]=t.label,e),{}),Cn=Ct.reduce((e,t)=>(e[t.label]=t.value,e),{}),H=e=>e.map(t=>({label:yo[t],value:t})),An=H(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),Pn=H(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),On=H(["=","<>","IS NULL","IS NOT NULL"]),vn=H(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),_n=H(["IS NULL","IS NOT NULL"]),Dn=H(["IN","NOT IN"]);var Ue=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"],To=new Set(Ue),le=e=>To.has(e),go=["integer","smallint","decimal","numeric","float","real","double precision","int","smallint","integer","bigint","decimal","numeric","real","double precision","serial","bigserial","money"],ho=new Set(go),At=e=>ho.has(e);var Un=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var xe=e=>e.fn?e.distinct===!0?`${e.fn} distinct ${e.value}`:`${e.fn} ${e.value}`:e.value;var Le={read_only:10,editor:20,admin:30,owner:40};var D=e=>e.startsWith("'")&&e.endsWith("'")||e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e;var Pt={operator:"LIKE",parse:e=>{let t=e.match(/^LIKE\s*["'](.*)["']$/i);if(t)return[{value:D(t[1])}]},stringify:(e,t)=>le(t)?`${e.value?.[0].value}`:`LIKE "%${e.value?.[0].value}%"`},Ot={operator:"NOT LIKE",parse:e=>{let t=e.match(/^NOT LIKE\s*["'](.*)["']$/i);if(t)return[{value:D(t[1])}]},stringify:e=>`NOT LIKE "%${e.value?.[0].value}%"`};function _t(e){return e===""?[]:wo(e).map(So)}function wo(e){let t=[],r=0,o="",a=!1,n=!1;for(;r<e.length;){let i=e[r];if((a||n)&&i==="\\"){o+=e[r+1],r+=2;continue}if(i==="'"&&!n){a=!a,o+=i,r++;continue}if(i==='"'&&!a){n=!n,o+=i,r++;continue}if(i===","&&!a&&!n){t.push(o.trim()),o="",r++;continue}o+=i,r++}if(o.trim()!==""&&t.push(o.trim()),a||n)throw new Error("Unterminated string literal");return t}function So(e){if(e.startsWith("'")&&e.endsWith("'"))return{value:vt(e.slice(1,-1),"'")};if(e.startsWith('"')&&e.endsWith('"'))return{value:vt(e.slice(1,-1),'"')};let t=Number(e);if(!Number.isNaN(t))return{value:t};throw new Error(`Invalid literal: ${e}`)}function vt(e,t){return e.replace(/\\(.)/g,(r,o)=>o)}var Dt={operator:"IN",parse:e=>{let t=e.match(/^in\s*\((.*)\)$/i);if(t)return _t(t[1])},stringify:e=>`IN (${e.value?.map(t=>`"${t.value}"`).join(", ")})`},Ut={operator:"NOT IN",parse:e=>{let t=e.match(/^not\s+in\s*\((.*)\)$/i);if(t)return _t(t[1])},stringify:e=>`NOT IN (${e.value?.map(t=>`"${t.value}"`).join(", ")})`};var xt={operator:"=",parse:e=>{let t=e.match(/^=\s*(.*)$/);if(t)return[{value:D(t[1])}]},stringify:(e,t)=>At(t)?`${e.value?.[0].value}`:`= ${e.value?.[0].value}`},Lt={operator:"!=",parse:e=>{let t=e.match(/^!=\s*(.*)$/);if(t)return[{value:D(t[1])}]},stringify:e=>`!= ${e.value?.[0].value}`},Mt={operator:"<>",parse:e=>{let t=e.match(/^<>\s*(.*)$/);if(t)return[{value:D(t[1])}]},stringify:e=>`<> ${e.value?.[0].value}`},kt={operator:">",parse:e=>{let t=e.match(/^>\s*(.*)$/);if(t)return[{value:D(t[1])}]},stringify:e=>`> ${e.value?.[0].value}`},qt={operator:">=",parse:e=>{let t=e.match(/^>=\s*(.*)$/);if(t)return[{value:D(t[1])}]},stringify:e=>`>= ${e.value?.[0].value}`},Ft={operator:"<",parse:e=>{let t=e.match(/^<\s*(.*)$/);if(t)return[{value:D(t[1])}]},stringify:e=>`< ${e.value?.[0].value}`},Qt={operator:"<=",parse:e=>{let t=e.match(/^<=\s*(.*)$/);if(t)return[{value:D(t[1])}]},stringify:e=>`<= ${e.value?.[0].value}`};var $t={operator:"IS NULL",parse:e=>{if(/^is\s+null$/i.test(e))return[]},stringify:()=>"IS NULL"},Bt={operator:"IS NOT NULL",parse:e=>{if(/^is\s+not\s+null$/i.test(e))return[]},stringify:()=>"IS NOT NULL"};var Wt=[Pt,Ot,Dt,Ut,xt,Lt,Mt,qt,kt,Qt,Ft,$t,Bt],Eo=Wt.reduce((e,t)=>(e[t.operator]=t,e),{});function Ro(e,t){return Eo[e.operator]?.stringify(e,t)||""}function bo(e){let t=e.trim();for(let r of Wt){let o=r.parse(t);if(o)return{operator:r.operator,value:o}}}var Ht={parse:bo,stringify:Ro};var R=e=>{let t=Le[e];return r=>Le[r.currentTeamRole]>=t},Yt=async e=>{let t=e.routeOptions.config.requireRole;if(t&&!t(e.user))throw new s(403,"You are not authorized to perform this action")};var jt=g(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=d(t),o=await b.findOne({where:{id:r}});if(!o)throw new s(404,"Data source not found");return{data:o}}}),e.route({method:"get",url:"/",handler:async t=>{let{teamId:r}=L(t);return{data:await b.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",config:{requireRole:R("admin")},handler:async t=>{let{teamId:r,ownerId:o,...a}=f(t,gt),n=b.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),i=await q(F(n),n.dbType,t);try{await i.checkConnection()}catch{throw new s(400,"Cannot connect to the database, please check datasource configuration")}let{tag:u,iv:m,encrypted:c}=ce.encrypt(n.dbPassword);return n.dbPassword=c,n.dbPasswordIv=m,n.dbPasswordTag=u,{data:await b.save(n)}}}),e.route({method:"put",url:"/:id",config:{requireRole:R("admin")},handler:async t=>{let{id:r}=d(t),o=f(t),a=await b.findOneBy({id:r});if(!a)throw new s(404,"Data source not found");let n=b.merge(a,o);return await b.save(n),{data:n}}}),e.route({method:"delete",url:"/:id",config:{requireRole:R("admin")},handler:async(t,r)=>w.transaction(async()=>{let{id:o}=d(t);await Promise.all([U.delete({datasource:{id:o}}),I.delete({dataSource:{id:o}})]),await b.delete({id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=d(t),a=await b.findOne({where:{id:o},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]});if(!a)throw new Error("Data source not found");a.status="INSPECTING",await b.save(a);let i=await(await q(F(a,!0),a.dbType,t)).inspectSchema();await U.delete({datasource:{id:o}}),await U.insert(i.sort().map(u=>U.create({tableName:u.tableName,columns:u.columns,datasource:{id:o}}))),a.status="READY",a.lastInspected=new Date,await b.save(a)}}),e.route({method:"get",url:"/:id/inspections",handler:async t=>{let{id:r}=d(t);return{data:await U.find({where:{datasource:{id:r}}})}}})});var $=require("typeorm"),Gt=g(e=>{e.route({method:"get",url:"/team/:teamId/datasources",handler:async t=>{let{teamId:r}=d(t);return{data:await b.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=d(t),o=L(t),a=r.teamId||t.user.currentTeamId,n=Number(o.size)||20,i=Number(o.page)||0,u=o.nameFilter?.length?{name:(0,$.Raw)(p=>`LOWER(${p}) LIKE :search`,{search:`%${o.nameFilter.toLowerCase()}%`})}:void 0,m=await x.find({where:[{isPersonal:!1,team:{id:a},query:u},{isPersonal:!0,team:{id:a},query:u,user:{id:t.user.id}}],relations:{query:{dataSource:!0}},take:n+1,skip:i*n,select:{id:!0,query:{id:!0,name:!0,updatedAt:!0,dataSource:{name:!0,dbType:!0}}},order:{query:{updatedAt:"DESC"}}}),c=m.length>n;return c&&m.pop(),{data:m.map(p=>({name:p.query.name,id:p.query.id,updatedAt:p.query.updatedAt,savedQueryId:p.id,datasourceName:p.query.dataSource.name,datasourceType:p.query.dataSource.dbType})),hasMore:c}}}),e.route({method:"get",url:"/team/:teamId/count-saved-queries",handler:async t=>{let o=d(t).teamId||t.user.currentTeamId;return{data:await x.count({where:[{isPersonal:!1,team:{id:o}},{isPersonal:!0,team:{id:o},user:{id:t.user.id}}],select:{id:!0}})}}}),e.route({method:"get",url:"/team/:teamId/query",handler:async t=>{let{teamId:r}=d(t),{search:o,size:a,selectedDataSources:n}=L(t),i=o.length>3?parseInt(a)||20:8,u={};n?.length&&(u.id=(0,$.In)(n));let[m,c,E]=await Promise.all([U.find({where:{tableName:(0,$.Raw)(l=>`LOWER(${l}) LIKE :search`,{search:`%${o.toLowerCase()}%`}),datasource:u},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:i}),A.find({where:{searchString:(0,$.Like)(`%${o.toLowerCase()}%`),team:{id:r},user:{id:t.user.id},dataSource:u},relations:{dataSource:!0},select:{id:!0,name:!0,updatedAt:!0,dataSource:{id:!0,name:!0}},order:{updatedAt:"ASC"},take:i}),x.find({where:{searchString:(0,$.Like)(`%${o.toLowerCase()}%`),team:{id:r},query:{dataSource:u}},relations:{query:{dataSource:!0}},select:{id:!0,updatedAt:!0,query:{id:!0,name:!0,dataSource:{name:!0}}},order:{updatedAt:"ASC"},take:i})]),p=[];return m.forEach(l=>{p.push({name:l.tableName,id:l.id,dataSourceName:l.datasource?.name||"--",dataSourceId:l.datasource?.id||"--",type:"table"})}),c.forEach(l=>{p.push({name:l.name,id:l.id,dataSourceName:l.dataSource?.name||"--",dataSourceId:l.dataSource?.id||"--",type:"tab"})}),E.forEach(l=>{p.push({name:l.query.name,id:l.query.id,dataSourceName:l.query.dataSource?.name||"--",dataSourceId:l.query.dataSource?.id||"--",type:"query"})}),{data:p}}}),e.route({method:"get",url:"/team/:teamId/tabs-history",handler:async t=>{let{teamId:r}=d(t),o=L(t),a=Number(o.page),n=Number(o.size),i=t.user.id,u=await A.find({where:{team:{id:r},user:{id:i},archived:o.archived?o.archived==="true":void 0},relations:{dataSource:!0},order:{updatedAt:"DESC"},take:n+1,skip:a*n}),m=!1;return u.length>n&&(u.pop(),m=!0),{data:u.map(c=>({name:c.name,id:c.id,updatedAt:c.updatedAt,archived:c.archived,createdAt:c.createdAt,dataSourceId:c.dataSource?.id,dataSourceName:c.dataSource?.name,dataSourceType:c.dataSource?.dbType})),hasMore:m}}})});var Kt=g(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=d(t),o=await I.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:R("editor")},handler:async t=>{let r=f(t),o=await b.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await I.save(I.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:R("editor")},handler:async t=>{let{id:r}=d(t),o=f(t);if(!(await I.update(r,o)).affected)throw new s(404,"Query not found");return{data:await I.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",config:{requireRole:R("editor")},handler:async t=>w.transaction(async()=>{let{id:r}=d(t);if(!(await I.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var me=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`},V={YEAR:e=>`EXTRACT(YEAR FROM ${e.value})`,MONTH:e=>`EXTRACT(MONTH FROM ${e.value})`,DAY:e=>`EXTRACT(DAY FROM ${e.value})`,SUM:e=>`COALESCE(SUM(${e.distinct===!0?"distinct ":""}${e.value}), 0)`,AVG:me,MAX:me,MIN:me,COUNT:me};var de=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`},z={YEAR:e=>`YEAR(${e.value})`,MONTH:e=>`MONTH(${e.value})`,DAY:e=>`DAY(${e.value})`,SUM:e=>{let t=e.distinct===!0?"distinct ":"";return`coalesce(${e.fn}(${t}${e.value}), 0)`},AVG:de,MAX:de,MIN:de,COUNT:de};var Vt=["SUM","COUNT","AVG","MAX","MIN"],Io=["YEAR","MONTH","DAY",...Vt],No=Io.reduce((e,t)=>(e[t]=!0,e),{}),Co=Vt.reduce((e,t)=>(e[t]=!0,e),{}),pe=e=>No[e],zt=e=>Co[e],Jt=(e,t)=>e.fn&&pe(e.fn)?(t==="postgres"?V:z)[e.fn](e):e.value;var fe=e=>typeof e=="string",Xt=e=>{let t="SELECT ";if(e.columns&&e.columns.length>0?t+=e.columns.join(", "):t+="*",e.table&&(t+=` FROM ${e.table}`),e.joins&&e.joins.length>0&&e.joins.forEach(r=>{t+=` ${r.type} JOIN ${r.table} ON ${r.on}`}),e.where&&(t+=` WHERE ${e.where}`),e.groupBy&&e.groupBy.length>0&&(t+=` GROUP BY ${e.groupBy.join(", ")}`),e.having&&(t+=` HAVING ${e.having}`),e.orderBy&&e.orderBy.length>0){let r=e.orderBy.reduce((a,n)=>(a[n.column]=n.direction,a),{}),o=Object.entries(r).map(([a,n])=>`${a} ${n}`);t+=` ORDER BY ${o.join(", ")}`}return e.limit!==void 0&&(t+=` LIMIT ${e.limit}`),e.offset!==void 0&&(t+=` OFFSET ${e.offset}`),t},J=(e,t)=>{let{column:r,operator:o,value:a,fn:n}=e,i=Jt({value:r,fn:n},t);switch(o){case"IS NULL":case"IS NOT NULL":return`${i} ${o}`;case"IN":case"NOT IN":let u=a?.map(l=>fe(l.value)?`'${l.value}'`:l.value).join(", ");return`${i} ${o} (${u})`;case"LIKE":return`${i} ${t==="postgres"?"ILIKE":"LIKE"} '%${a?.[0].value}%'`;case"NOT LIKE":return`${i} ${t==="postgres"?"NOT ILIKE":"NOT LIKE"} '%${a?.[0].value}%'`;default:let E=a?.[0],p;return fe(E?.value)&&E?.isColumn!==!0?p=`'${E?.value}'`:p=E?.value,`${i} ${o} ${p}`}};var X=class{constructor(t="mysql"){this.dialect=t,this.skeleton={type:"SELECT"}}addWhere(t){let r=J(t,this.dialect);if(this.skeleton.where){let o=t.connector||"AND";this.skeleton.where+=` ${o} ${r}`}else this.skeleton.where=r;return this}addWhereRaw(t,r="AND"){return this.skeleton.where?this.skeleton.where+=` ${r} ${t}`:this.skeleton.where=t,this}clearWhere(){return this.skeleton.where=void 0,this}addHaving(t){let r=J(t,this.dialect);if(this.skeleton.having){let o=t.connector||"AND";this.skeleton.having+=` ${o} ${r}`}else this.skeleton.having=r;return this}clearHaving(){return this.skeleton.having=void 0,this}addOrderBy(...t){return this.skeleton.orderBy||(this.skeleton.orderBy=[]),this.skeleton.orderBy.push(...t),this}clearOrderBy(){return this.skeleton.orderBy=void 0,this}setLimit(t){return this.skeleton.limit=t,this}setOffset(t){return this.skeleton.offset=t,this}addGroupBy(t){this.skeleton.groupBy||(this.skeleton.groupBy=[]);let r=this.skeleton.groupBy.findIndex(o=>o===t);return r>-1?this.skeleton.groupBy[r]=t:this.skeleton.groupBy.push(t),this}setTable(t){return this.skeleton.table=t,this}addJoin(...t){return this.skeleton.joins||(this.skeleton.joins=[]),this.skeleton.joins.push(...t),this}selectColumns(t){if(this.skeleton.type!=="SELECT")throw new Error("Column selection is only supported for SELECT queries");return this.skeleton.columns=t,this}toSQL(){return Xt(this.skeleton)}};var rr=require("typeorm");var Zt=e=>le(e)?"LIKE":"=",er=(e,t)=>{let r=[];for(let o of e)if(!(!o.column?.length||!o.value?.length||o.isEnabled===!1))if(o.isAdvanced){let a=Ht.parse(o.value);if(!a)throw new s(400,`Invalid value for '${o.column}': ${o.value}`);r.push({value:a.value,column:o.column,id:o.id,operator:a.operator||Zt(t[o.column]),connector:"AND"})}else r.push({value:o.value?[{value:o.value}]:[],column:o.column,id:o.id,operator:Zt(t[o.column]),connector:"AND"});return r};var ye=async(e,t)=>{let{datasourceId:r,size:o=20,page:a,name:n}=t,{table:i,joins:u,groupBy:m,searchAll:c,orderBy:E}=t.opts,p=_o(t.opts.columns,t.opts.groupBy,t.opts.aggregations),l=await Te(r),N=[i],M=[];if(!l)throw new s(404,"Data source not found");let qr=await I.save(I.create({user:{id:e.user.id},team:{id:e.user.currentTeamId},dataSource:{id:r},name:n,opts:t.opts})),P=new X(l.dbType);P.setTable(i),P.setLimit(o+1),P.setOffset(o*a),u&&(P.addJoin(...u),u.forEach(T=>{N.push(T.table)}));let qe=vo(p,E,l.dbType);qe.length>0&&P.addOrderBy(...qe),m&&m.length>0&&m.forEach(T=>P.addGroupBy(Oo(T,l.dbType)));let Fr=await U.find({where:{tableName:(0,rr.In)(N),datasource:{id:r}}});for(let T of Fr)if(T.columns)for(let O of T.columns)M.push({column:O.name,table:T.tableName||"",full:`${T.tableName}.${O.name}`,type:O.type});let Fe=M.reduce((T,O)=>(T[O.full]=O.type,T),{});er(t.opts.filters,Fe)?.forEach(T=>{T.fn&&zt(T.fn)?P.addHaving(T):P.addWhere(T)});let ee;if(p&&p.length>0?ee=p.map(T=>Po(T,l.dbType)):ee=M.map(T=>`${T.full} as "${T.full}"`),P.selectColumns(ee),c){let T=M.filter(O=>Ue.includes(O.type)&&ee.some(we=>we.startsWith(O.full)));if(T.length>0){let O=T.map(we=>`LOWER(${we.full}) LIKE '%${c.toLowerCase()}%'`);P.addWhereRaw(`(${O.join(" OR ")})`,"AND")}}let te=await(await q(F(l,!0),l.dbType,e)).executeQuery(P.toSQL(),{type:"SELECT",allowBulkUpdate:!1}),Qe=te.rows.length>o;return Qe&&te.rows.pop(),{...te,queryHistoryId:qr.id,tables:N,allColumns:M,columns:te.columns.map(T=>({...T,type:Fe[T.full]})),hasMore:Qe}},or=async(e,t)=>{let r=await Te(t.dataSourceId);if(!r)throw new s(400,"Invalid datasource");let o=await q(F(r,!0),r.dbType,e),a=new X(r.dbType);a.setTable(t.table),a.setLimit(2);for(let[u,m]of Object.entries(t.props))a.addWhere({value:[{value:m}],column:u,connector:"AND",isEnabled:!0,operator:"=",id:"dummy"});let n=a.toSQL(),i=await o.executeQuery(n,{type:"SELECT",allowBulkUpdate:!1});if(i.rows.length>1)throw new s(400,"Found multiple rows for given query");if(i.rows.length<1)throw new s(404,"Entity not found");return{entity:i.rows[0],columns:i.columns,sql:n}},ar=async(e,t)=>{let r=await Te(t.datasourceId);if(!r)throw new s(404,"Data source not found");if(!r.allowUpdate)throw new s(403,"This datasource does not allow update operations");let o=t.values.map(({value:u,column:m})=>typeof u=="string"?u&&u.startsWith("=")?`${m}=${u.substring(1)}`:`${m}='${u}'`:`${m}='${u}'`).join(", "),a=t.filters.map(u=>J(u,r.dbType)).join(" AND "),n=`UPDATE ${t.table} SET ${o} WHERE ${a}`;return(await q(F(r,!0),r.dbType,e)).executeQuery(n,{type:"UPDATE",allowBulkUpdate:!1})},nr=async(e,t)=>{let r=await Te(t.datasourceId);if(!r)throw new s(404,"Data source not found");if(!r.allowInsert)throw new s(403,"This datasource does not allow insert operations");let{keys:o,values:a}=Ao(t.values),n=`INSERT INTO ${t.table} (${o}) VALUES (${a})`;return(await q(F(r,!0),r.dbType,e)).executeQuery(n,{type:"INSERT",allowBulkUpdate:!1})},Ao=e=>{let t=e.map(({column:o})=>o).join(", "),r=e.map(({value:o})=>typeof o=="string"?o&&o.startsWith("=")?o.substring(1):`'${o}'`:o).join(", ");return{keys:t,values:r}},Po=(e,t)=>{if(e.fn){if(pe(e.fn))return`${(t==="postgres"?V:z)[e.fn](e)} as "${xe(e)}"`;throw new Error("Function not allowed: "+e.fn)}return`${e.value} as "${e.value}"`},Oo=(e,t)=>{if(e.fn){if(pe(e.fn))return(t==="postgres"?V:z)[e.fn]({...e,value:tr(e.value,t)});throw new Error("Function not allowed: "+e.fn)}return tr(e.value,t)},Me=(e,t)=>t==="postgres"?`"${e}"`:t==="mysql"?`\`${e}\``:e,tr=(e,t)=>{let[r,o]=e.split(".");return Me(r,t)+"."+Me(o,t)},vo=(e,t,r)=>{if(e&&e.length>0){let o=e.reduce((a,n)=>(a.set(xe(n),{isFn:!!(n.fn||n.distinct)}),a),new Map);t=t.filter(a=>o.has(a.column)).map(a=>o.get(a.column)?.isFn?{...a,column:Me(a.column,r)}:a)}return t},_o=(e,t,r)=>{let o=[];return t.length>0||r.length>0?o.push(...t,...r):e.length>0&&o.push(...e),o};async function Te(e){return b.findOne({where:{id:e},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowUpdate","allowInsert"]})}var sr=e=>{},Do=["--",";","DROP","drop"],ir=e=>{if(fe(e.value)&&e.value.startsWith("=")){let t=e.value;Do.forEach(r=>{if(t.includes(r))throw new s(400,"Invalid input value for "+e.column)})}},ur=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(ir)},cr=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(ir)};var lr=g(e=>{e.route({method:"post",url:"/:dsId/select",handler:async t=>{let r=f(t,sr);return{data:await ye(t,r)}}}),e.route({method:"get",url:"/:dsId/entity/:table",handler:async t=>{let{dsId:r,table:o}=d(t),a=L(t);return{data:await or(t,{table:o,dataSourceId:r,props:a})}}}),e.route({method:"post",url:"/:dsId/insert",config:{requireRole:R("editor")},handler:async t=>{let r=f(t,ur);return{data:await nr(t,r)}}}),e.route({method:"post",url:"/:dsId/update",config:{requireRole:R("editor")},handler:async t=>{let r=f(t,cr);return{data:await ar(t,r)}}})});var mr=g(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:y.str("SERVER_VERSION")}}))});var dr=g(e=>{e.route({method:"get",url:"/:id/users",handler:async t=>{let{id:r}=d(t),o=await k.findOne({where:{id:r},relations:{users:{user:!0}}});if(!o)throw new s(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:R("editor")},handler:async t=>w.transaction(async()=>{let r=t.user.id,o=f(t),a=S.create();a.id=r;let n=k.create(o);await k.save(n);let i=C.create({user:a,team:n});return await C.save(i),{data:n}})}),e.route({method:"patch",url:"/:id/user-role",config:{requireRole:R("admin")},handler:async t=>{let{id:r}=d(t),{role:o,userId:a}=f(t,({role:i})=>{if(i==="owner")throw new s(400,"Only one owner is allowed")});if((await C.findOneBy({user:{id:a},team:{id:r}}))?.role==="owner")throw new s(400,"Cannot change owner role");await C.update({user:{id:a},team:{id:r}},{role:o})}}),e.route({method:"delete",url:"/:id",config:{requireRole:R("admin")},handler:async t=>w.transaction(async()=>{let{id:r}=d(t),{userId:o}=L(t);if((await C.findOneBy({user:{id:o},team:{id:r}}))?.role==="owner")throw new s(400,"Cannot delete team owner");await S.update(o,{currentTeam:null}),await C.delete({user:{id:o},team:{id:r}}),await S.delete({id:o})})})});var ke=v(require("bcryptjs")),Z=async e=>{let t=await ke.default.genSalt(10);return ke.default.hash(e,t)};var pr=g(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=await S.findOne({where:{id:t.user.id},relations:{currentTeam:{team:!0}}});if(!r)throw new s(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 S.update(r,o)).affected)throw new s(404,"User not found");let n=await S.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:R("admin")},handler:async t=>w.transaction(async()=>{let r=f(t),o=await Z(r.password),a=await S.save(S.create({username:r.username,password:o})),n=await C.save(C.create({role:"read_only",team:{id:r.teamId},user:{id:a.id}}));await S.update(a.id,{currentTeam:{id:n.id}})})})});var fr=g(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 s(400,"Settings id is required!");if(!(await W.update(r.id,r)).affected)throw new s(404,"You do not own these settings!");return{data:await W.findOneBy({id:r.id})}}})});function Y(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 yr=g(e=>{e.route({method:"post",url:"/",config:{requireRole:R("editor")},handler:async t=>{let r=f(t),o=await I.findOne({where:{id:r.queryId}});if(!o)throw new s(400,"Query not found");let a=await x.save(x.create({isPersonal:!1,team:{id:t.user.currentTeamId},user:{id:t.user.id},query:{id:r.queryId},searchString:Y(o.opts,r.name)}));return await I.update(r.queryId,{name:r.name}),{data:a}}}),e.route({method:"delete",url:"/:id",config:{requireRole:R("editor")},handler:async t=>{let{id:r}=d(t);if(!(await x.delete({id:r})).affected)return{status:404,data:"Query not found"}}}),e.route({method:"patch",url:"/:id",handler:async t=>await w.transaction(async()=>{let{id:r}=d(t),o=f(t,i=>{if(!i.name)throw new s(400,"Name is required")}),a=await x.findOne({where:{id:r},relations:{query:!0}});if(!a)throw new s(400,"Query not found");let n=Y(a.query.opts,o.name);return await Promise.all([x.update({id:r},{searchString:n}),I.update({id:a.query.id},{name:o.name})]),{data:!0}})})});var Tr=e=>{if(!e.queryId&&!(e.opts&&e.name))throw new s(400,"Either queryId or name and opts are required")};var gr=g(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}=d(t),{currentTeamId:o,id:a}=t.user,n=await A.findOne({where:{id:r,team:{id:o},user:{id:a}}});if(!n)throw new s(404,"Not Found");return{data:n}}}),e.route({method:"post",url:"/",handler:async t=>{let{opts:r,name:o,queryId:a}=f(t,Tr),n,i,u=o;if(r)i=r.dataSourceId,n=r;else{let c=await I.findOne({where:{id:a},relations:{dataSource:!0}});if(!c)throw new s(404,"Query not Found");i=c.dataSource.id,n={table:c.opts.table,filters:c.opts.filters,joins:c.opts.joins,orderBy:c.opts.orderBy,columns:c.opts.columns,groupBy:c.opts.groupBy,searchAll:c.opts.searchAll,aggregations:c.opts.aggregations,dataSourceId:c.dataSource.id,page:0,size:50},o||(u=c.name)}return{data:await A.save(A.create({name:u||new Date().toISOString(),opts:n,dataSource:{id:i},user:{id:t.user.id},team:{id:t.user.currentTeamId}}))}}}),e.route({method:"post",url:"/:id/run",handler:async t=>{let{id:r}=d(t),o=f(t),a=await A.findOne({where:{id:r},relations:{user:!0}});if(!a)throw new s(404,"Not found");if(a.user?.id!==t.user.id)throw new s(404,"Not found");return o&&A.update(r,{opts:o,searchString:Y(o,a.name),updatedAt:new Date}),{data:{result:await ye(t,{datasourceId:o.dataSourceId,size:o.size,name:a.name,page:o.page,opts:{table:o.table,filters:o.filters,joins:o.joins,orderBy:o.orderBy,columns:o.columns,groupBy:o.groupBy,searchAll:o.searchAll,aggregations:o.aggregations}})}}}}),e.route({method:"patch",url:"/:id",handler:async t=>{let{id:r}=d(t),o=f(t),a=await A.findOne({where:{id:r,user:{id:t.user.id}}});if(!a)throw new s(404,"Not Found");let n=a.searchString;return o.name&&(n=Y(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}=d(t),o=t.user.id;return await A.delete({id:r,user:{id:o}}),{data:!0}}})});var Sr=require("node:crypto");var hr=require("node:crypto"),wr={teamName:"Default Team",username:"admin"},Uo=async()=>{let e=await k.findOneBy({});return e||k.save(k.create({name:wr.teamName}))},ge=async e=>{let t=await C.findOne({where:{role:"owner"},relations:{user:!0}});if(t)return t.user;let r=await Uo(),o=await Z(e?.password||(0,hr.randomBytes)(32).toString("hex")),a=await S.save(S.create({username:e?.name||wr.username,password:o})),n=await C.save(C.create({user:a,team:r,role:"owner"}));return await S.update(a.id,{currentTeam:n}),a};var he={setupAccessToken:void 0},Er=()=>(he.setupAccessToken=(0,Sr.randomBytes)(32).toString("hex"),he.setupAccessToken),xo=e=>{if(!he.setupAccessToken)throw new s(400,"Setup already performed");if(!e||e!==he.setupAccessToken)throw new s(400,"Invalid setup access token")},B=async()=>_.skipAuth?!1:await S.count()<1,Rr=async e=>{xo(e.setupAccessToken),await ge({name:e.userName,password:e.userPassword})};var br=g(e=>{e.route({method:"get",url:"/client.config.js",handler:(t,r)=>{let o={skipAuth:_.skipAuth,modeName:_.name,usesCustomDb:je(),serverVersion:y.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 B()?r.redirect("/setup"):r.sendFile("index.html")}),e.route({method:"get",url:"/setup",handler:async(t,r)=>await B()?r.sendFile("setup.html"):r.redirect("/")})});var Ir=e=>{if(!e.setupAccessToken)throw new s(400,"Invalid setup access token");if(!e.userPassword||e.userPassword.length<8)throw new s(400,"Password should be at least 8 chars long");if(!e.userName)throw new s(400,"User name is required")};var Nr=g(e=>{e.route({method:"post",url:"/",config:{isPublic:!0},handler:async t=>{if(!await B())throw new s(400,"Setup has already been completed");let o=f(t,Ir);return await Rr(o),{data:!0}}})});var Lo=[[br,"/"],[Tt,"/api/auth"],[jt,"/api/data-sources"],[Gt,"/api/project"],[Kt,"/api/queries"],[lr,"/api/runner"],[mr,"/api/status"],[dr,"/api/teams"],[pr,"/api/users"],[fr,"/api/user-settings"],[yr,"/api/saved-queries"],[gr,"/api/workbench-tabs"],[Nr,"/api/setup"]],Cr=e=>{for(let[t,r]of Lo)e.register(t,{prefix:r}),console.log("Registered "+r)};var Mo=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),ko=async()=>C.findOne({where:{role:"owner"},relations:{user:!0,team:!0}}),qo=async e=>{let t=await ko();if(!t)throw new s(401,"User is not part of a team");e.user={id:t.user.id,currentTeamId:t.team.id,currentTeamRole:t.role}},Fo=async e=>{let t=e.headers.authorization;if(!t)throw new s(401,"Missing auth token");let[r,o]=t.split(" "),{userId:a}=await dt(o),n=await S.findOne({where:{id:a},select:{id:!0,currentTeam:{role:!0,team:{id:!0}}},relations:{currentTeam:{team:!0}}});if(!n)throw new s(401,"Unauthorized");e.user={id:a,currentTeamId:n.currentTeam.team.id,currentTeamRole:n.currentTeam.role}},Ar=async e=>{Mo(e)||(_.skipAuth?await qo(e):await Fo(e))};var Pr=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Or=e=>{e.addHook("onRequest",Ar),e.addHook("onRequest",Yt),e.addHook("onResponse",Pr)};var vr=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 s?o.status(t.status).send({error:t.message}):o.status(500).send({error:"Internal Server Error"})})};var _r=v(require("@fastify/cookie")),Dr=v(require("@fastify/cors"));var Ur=v(require("@fastify/static")),xr=require("node:path"),Lr=e=>{e.register(_r.default,{}),e.register(Dr.default,{origin:j.allowedOrigins,methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),e.register(Ur.default,{root:(0,xr.join)(__dirname,"web")})};(async function(){let t=(0,Mr.default)({querystringParser:o=>kr.default.parse(o)});if(Ye(),Lr(t),Or(t),Cr(t),vr(t),await t.after(),await nt(),t.listen({port:j.port,host:j.host},(o,a)=>{o&&(console.error(o),process.exit(1)),console.log(`Server listening at ${a}`)}),await B()){let o=Er();console.log(`Setup access token:
58
- ${o}`),console.log("Use the above token to finish the setup process when opening the app for the first time.")}else await ge()})();
57
+ limit 75;`;return(await t.query(r)).rows.reduce((a,n)=>(a[n.row_key]={table:n.relname,column:n.attname},a),{})},yt=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:s,rowCount:u}=await r.query({text:e,rowMode:"array",values:t});if(s==="UPDATE"||s==="INSERT"||s==="DELETE"){if(u!=null&&u>1&&o.allowBulkUpdate!==!0)throw new Error("[PG CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[u]],query:e}}if(s==="SELECT"){let m=n.map(S=>`'${S.tableID}-${S.columnID}'`),c=await ho(m,r);return{columns:n.map(S=>{let p=c[`${S.tableID}-${S.columnID}`];return{column:p?.column||S.name,alias:S.name,table:p?.table||"",full:p?p.table+"."+p.column:S.name}}),rows:a,query:e}}throw new Error(`[PG CONN] Unsupported command: ${s}`)}catch(a){throw a instanceof i?a:new i(400,a.message)}},wo=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}},So=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}},gt=async e=>{let t=await fo(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:()=>go(e,t),executeQuery:n=>a(()=>n.type==="SELECT"?So(t,()=>yt(n.sql,n.params,t,n)):wo(t,()=>yt(n.sql,n.params,t,n))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.end()}}};var M=async(e,t,r)=>{try{let o;if(t==="mysql")o=await ft(e);else if(t==="postgres")o=await gt(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)}};var ae=O(require("node:crypto"));var ht="aes-256-gcm",Eo=12,wt=()=>{let e=y.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},Io=e=>{let t=ae.default.randomBytes(Eo),r=wt(),o=ae.default.createCipheriv(ht,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")}},bo=({encrypted:e,iv:t,tag:r})=>{let o=wt(),a=ae.default.createDecipheriv(ht,o,Buffer.from(t,"hex"));a.setAuthTag(Buffer.from(r,"hex"));let n=a.update(e,"hex","utf8");return n+=a.final("utf8"),n},ne={encrypt:Io,decrypt:bo};var k=(e,t=!1)=>{if(t){let r=ne.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 St=[{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"}],Ro=St.reduce((e,t)=>(e[t.value]=t.label,e),{}),Kn=St.reduce((e,t)=>(e[t.label]=t.value,e),{}),W=e=>e.map(t=>({label:Ro[t],value:t})),jn=W(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),Vn=W(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL","CONTAINS","NOT CONTAINS"]),zn=W(["=","<>","IS NULL","IS NOT NULL"]),Jn=W(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),Xn=W(["IS NULL","IS NOT NULL"]),Zn=W(["IN","NOT IN"]),Co=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"],No=new Set(Co),se=e=>No.has(e),Ao=["integer","smallint","decimal","numeric","float","real","double precision","int","smallint","integer","bigint","decimal","numeric","real","double precision","serial","bigserial","money"],Po=new Set(Ao),Et=e=>Po.has(e);var es=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var Ae={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 It={operator:"LIKE",parse:e=>{let t=e.match(/^LIKE\s*["'](.*)["']$/i);if(t)return[{value:P(t[1])}]},stringify:e=>`LIKE "%${e[0]?.value}%"`},bt={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}%"`},Rt={operator:"CONTAINS",parse:e=>{let t=e.match(/^CONTAINS\s*["'](.*)["']$/i);if(t)return[{value:P(t[1])}]},stringify:(e,t)=>se(t)?`${e[0]?.value}`:`CONTAINS "%${e[0]?.value}%"`},Ct={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 At(e){return e===""?[]:Oo(e).map(_o)}function Oo(e){let t=[],r=0,o="",a=!1,n=!1;for(;r<e.length;){let s=e[r];if((a||n)&&s==="\\"){o+=e[r+1],r+=2;continue}if(s==="'"&&!n){a=!a,o+=s,r++;continue}if(s==='"'&&!a){n=!n,o+=s,r++;continue}if(s===","&&!a&&!n){t.push(o.trim()),o="",r++;continue}o+=s,r++}if(o.trim()!==""&&t.push(o.trim()),a||n)throw new Error("Unterminated string literal");return t}function _o(e){if(e.startsWith("'")&&e.endsWith("'"))return{value:Nt(e.slice(1,-1),"'")};if(e.startsWith('"')&&e.endsWith('"'))return{value:Nt(e.slice(1,-1),'"')};let t=Number(e);if(!Number.isNaN(t))return{value:t};throw new Error(`Invalid literal: ${e}`)}function Nt(e,t){return e.replace(/\\(.)/g,(r,o)=>o)}var Pt={operator:"IN",parse:e=>{let t=e.match(/^in\s*\((.*)\)$/i);if(t)return At(t[1])},stringify:e=>`IN (${e?.map(t=>`"${t.value}"`).join(", ")})`},Ot={operator:"NOT IN",parse:e=>{let t=e.match(/^not\s+in\s*\((.*)\)$/i);if(t)return At(t[1])},stringify:e=>`NOT IN (${e?.map(t=>`"${t.value}"`).join(", ")})`};var _t={operator:"=",parse:e=>{let t=e.match(/^=\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:(e,t)=>Et(t)?`${e[0]?.value}`:`= ${e[0]?.value}`},xt={operator:"!=",parse:e=>{let t=e.match(/^!=\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`!= ${e[0]?.value}`},vt={operator:"<>",parse:e=>{let t=e.match(/^<>\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`<> ${e[0]?.value}`},Dt={operator:">",parse:e=>{let t=e.match(/^>\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`> ${e[0]?.value}`},Ut={operator:">=",parse:e=>{let t=e.match(/^>=\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`>= ${e[0]?.value}`},Lt={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}`};var Mt={operator:"IS NULL",parse:e=>{if(/^is\s+null$/i.test(e))return[]},stringify:()=>"IS NULL"},kt={operator:"IS NOT NULL",parse:e=>{if(/^is\s+not\s+null$/i.test(e))return[]},stringify:()=>"IS NOT NULL"};var xo=[It,Rt,bt,Ct,Pt,Ot,_t,xt,vt,Ut,Dt,qt,Lt,Mt,kt];function vo(e){let t=e.trim();for(let r of xo){let o=r.parse(t);if(o)return{operator:r.operator,value:o}}}var Qt={parse:vo};var E=e=>{let t=Ae[e];return r=>Ae[r.currentTeamRole]>=t},Bt=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 Ft=T(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=d(t),o=await I.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}=U(t);return{data:await I.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",config:{requireRole:E("admin")},handler:async t=>{let{teamId:r,ownerId:o,...a}=f(t,mt),n=I.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),s=await M(k(n),n.dbType,t);try{await s.checkConnection()}catch{throw new i(400,"Cannot connect to the database, please check datasource configuration")}let{tag:u,iv:m,encrypted:c}=ne.encrypt(n.dbPassword);return n.dbPassword=c,n.dbPasswordIv=m,n.dbPasswordTag=u,{data:await I.save(n)}}}),e.route({method:"put",url:"/:id",config:{requireRole:E("admin")},handler:async t=>{let{id:r}=d(t),o=f(t),a=await I.findOneBy({id:r});if(!a)throw new i(404,"Data source not found");let n=I.merge(a,o);return await I.save(n),{data:n}}}),e.route({method:"delete",url:"/:id",config:{requireRole:E("admin")},handler:async(t,r)=>h.transaction(async()=>{let{id:o}=d(t);await Promise.all([v.delete({datasource:{id:o}}),b.delete({dataSource:{id:o}})]),await I.delete({id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=d(t),a=await I.findOne({where:{id:o},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]});if(!a)throw new Error("Data source not found");a.status="INSPECTING",await I.save(a);let s=await(await M(k(a,!0),a.dbType,t)).inspectSchema();await v.delete({datasource:{id:o}}),await v.insert(s.sort().map(u=>v.create({tableName:u.tableName,columns:u.columns,datasource:{id:o}}))),a.status="READY",a.lastInspected=new Date,await I.save(a)}}),e.route({method:"get",url:"/:id/inspections",handler:async t=>{let{id:r}=d(t);return{data:await v.find({where:{datasource:{id:r}}})}}})});var B=require("typeorm"),$t=T(e=>{e.route({method:"get",url:"/team/:teamId/datasources",handler:async t=>{let{teamId:r}=d(t);return{data:await I.find({where:{team:{id:r}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0,dbType:!0,description:!0,allowInsert:!0,allowUpdate:!0}})}}}),e.route({method:"get",url:"/team/:teamId/queries",handler:async t=>{let r=d(t),o=U(t),a=r.teamId||t.user.currentTeamId,n=Number(o.size)||20,s=Number(o.page)||0,u=o.nameFilter?.length?{name:(0,B.Raw)(p=>`LOWER(${p}) LIKE :search`,{search:`%${o.nameFilter.toLowerCase()}%`})}:void 0,m=await D.find({where:[{isPersonal:!1,team:{id:a},query:u},{isPersonal:!0,team:{id:a},query:u,user:{id:t.user.id}}],relations:{query:{dataSource:!0}},take:n+1,skip:s*n,select:{id:!0,query:{id:!0,name:!0,updatedAt:!0,dataSource:{name:!0,dbType:!0}}},order:{query:{updatedAt:"DESC"}}}),c=m.length>n;return c&&m.pop(),{data:m.map(p=>({name:p.query.name,id:p.query.id,updatedAt:p.query.updatedAt,savedQueryId:p.id,datasourceName:p.query.dataSource.name,datasourceType:p.query.dataSource.dbType})),hasMore:c}}}),e.route({method:"get",url:"/team/:teamId/count-saved-queries",handler:async t=>{let o=d(t).teamId||t.user.currentTeamId;return{data:await D.count({where:[{isPersonal:!1,team:{id:o}},{isPersonal:!0,team:{id:o},user:{id:t.user.id}}],select:{id:!0}})}}}),e.route({method:"get",url:"/team/:teamId/query",handler:async t=>{let{teamId:r}=d(t),{search:o,size:a,selectedDataSources:n}=U(t),s=o.length>3?parseInt(a)||20:8,u={};n?.length&&(u.id=(0,B.In)(n));let[m,c,S]=await Promise.all([v.find({where:{tableName:(0,B.Raw)(l=>`LOWER(${l}) LIKE :search`,{search:`%${o.toLowerCase()}%`}),datasource:u},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:s}),A.find({where:{searchString:(0,B.Like)(`%${o.toLowerCase()}%`),team:{id:r},user:{id:t.user.id},dataSource:u},relations:{dataSource:!0},select:{id:!0,name:!0,updatedAt:!0,dataSource:{id:!0,name:!0}},order:{updatedAt:"ASC"},take:s}),D.find({where:{searchString:(0,B.Like)(`%${o.toLowerCase()}%`),team:{id:r},query:{dataSource:u}},relations:{query:{dataSource:!0}},select:{id:!0,updatedAt:!0,query:{id:!0,name:!0,dataSource:{name:!0}}},order:{updatedAt:"ASC"},take:s})]),p=[];return m.forEach(l=>{p.push({name:l.tableName,id:l.id,dataSourceName:l.datasource?.name||"--",dataSourceId:l.datasource?.id||"--",type:"table"})}),c.forEach(l=>{p.push({name:l.name,id:l.id,dataSourceName:l.dataSource?.name||"--",dataSourceId:l.dataSource?.id||"--",type:"tab"})}),S.forEach(l=>{p.push({name:l.query.name,id:l.query.id,dataSourceName:l.query.dataSource?.name||"--",dataSourceId:l.query.dataSource?.id||"--",type:"query"})}),{data:p}}}),e.route({method:"get",url:"/team/:teamId/tabs-history",handler:async t=>{let{teamId:r}=d(t),o=U(t),a=Number(o.page),n=Number(o.size),s=t.user.id,u=await A.find({where:{team:{id:r},user:{id:s},archived:o.archived?o.archived==="true":void 0},relations:{dataSource:!0},order:{updatedAt:"DESC"},take:n+1,skip:a*n}),m=!1;return u.length>n&&(u.pop(),m=!0),{data:u.map(c=>({name:c.name,id:c.id,updatedAt:c.updatedAt,archived:c.archived,createdAt:c.createdAt,dataSourceId:c.dataSource?.id,dataSourceName:c.dataSource?.name,dataSourceType:c.dataSource?.dbType})),hasMore:m}}})});var Wt=T(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=d(t),o=await b.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:E("editor")},handler:async t=>{let r=f(t),o=await I.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await b.save(b.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:E("editor")},handler:async t=>{let{id:r}=d(t),o=f(t);if(!(await b.update(r,o)).affected)throw new i(404,"Query not found");return{data:await b.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",config:{requireRole:E("editor")},handler:async t=>h.transaction(async()=>{let{id:r}=d(t);if(!(await b.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var Ht=e=>se(e)?"CONTAINS":"=",Oe=(e,t)=>{let r=[];for(let o of e)if(!(!o.column?.length||!o.value?.length||o.isEnabled===!1))if(o.isAdvanced){let a=Qt.parse(o.value);if(!a)throw new i(400,`Invalid value for '${o.column}': ${o.value}`);r.push({value:a.value,column:o.column,operator:a.operator||Ht(t(o.column)),fn:o.fn})}else r.push({value:o.value?[{value:o.value}]:[],column:o.column,operator:Ht(t(o.column)),fn:o.fn});return r},Yt=e=>{let t=[e.table];return e.joins&&e.joins.forEach(({table:r})=>t.push(r)),t},Pe=e=>({column:e.value,fn:e.fn,distinct:e.distinct}),Gt=(e,t,r)=>{let o=[];return t.length>0||r.length>0?o.push(...t.map(Pe),...r.map(Pe)):e.length>0&&o.push(...e.map(Pe)),o},Kt=(e,t,r)=>t.map((o,a)=>({...o,full:e[a].fn?e[a].column:o.full,type:r(o.full),fn:e[a].fn}));var _e=require("typeorm"),jt=new _e.DataSource({type:"mysql"}),Vt=new _e.DataSource({type:"postgres"}),H=e=>{switch(e){case"postgres":return Vt.createQueryBuilder();case"mysql":return jt.createQueryBuilder();default:throw new Error("Unsupported database connection")}},ie={postgres:Vt.driver,mysql:jt.driver};var V=(e,t,r)=>{let{column:o,operator:a,value:n}=e,s="_"+t;switch(a){case"IS NULL":case"IS NOT NULL":return[`${o} ${a}`,{value:void 0}];case"IN":case"NOT IN":return[`${o} ${a} (:...${s})`,{[s]:n?.map(c=>c.value)}];case"LIKE":case"CONTAINS":return[`${o} ${r==="postgres"?"ILIKE":"LIKE"} :${s}`,{[s]:a==="CONTAINS"?`%${n?.[0].value}%`:n?.[0].value}];case"NOT LIKE":case"NOT CONTAINS":return[`${o} ${r==="postgres"?"NOT ILIKE":"NOT LIKE"} :${s}`,{[s]:a==="NOT CONTAINS"?`%${n?.[0].value}%`:n?.[0].value}];default:return[`${o} ${a} :${s}`,{[s]:n?.[0]?.value}]}};var zt=e=>{let t=ie[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 Jt=["SUM","COUNT","AVG","MAX","MIN"],Do=["YEAR","MONTH","DAY",...Jt],Uo=Do.reduce((e,t)=>(e[t]=!0,e),{}),Lo=Jt.reduce((e,t)=>(e[t]=!0,e),{}),Xt=e=>Uo[e],Zt=e=>Lo[e];var ue=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,er={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:ue,MAX:ue,MIN:ue,COUNT:ue};var ce=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,tr={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:ce,MAX:ce,MIN:ce,COUNT:ce};var qo=e=>{let t=[];return e.fn&&t.push(e.fn),e.distinct&&t.push("distinct"),t.push(e.column),t.join(" ")},Mo=e=>{let t=zt(e),r=e==="postgres"?er:tr;return o=>o.fn&&Xt(o.fn)?r[o.fn](t(o.column),o.fn,o.distinct):t(o.column)};function rr(e,t){let r=H(t.dbType).from(e,e),o=!1,a=0,n=Mo(t.dbType),s={};return{setColumns(u){u.forEach(m=>{let c=qo(m);s[c]=c,r.addSelect(n(m),c)})},setLimit:u=>{r.limit(u),o=!0},setOffset(u){r.skip(u)},addOrderBy(u,m){r.addOrderBy(u,m)},addJoin({table:u,alias:m,on:c}){r.leftJoin(u,m||u,c)},addWhere(u){let[m,c]=V({...u,operator:u.operator||"=",column:n(u)},++a,t.dbType);r.andWhere(m,c)},addHaving(u){let[m,c]=V({...u,operator:u.operator||"=",column:n(u)},++a,t.dbType);r.andHaving(m,c)},addGroupBy(u){r.addGroupBy(n(u))},hasAlias(u){return!!s[u]},build(){o||r.limit(50);let[u,m]=r.getQueryAndParameters();return{sql:u,params:m}}}}var or=(e,t)=>{let r=H(t.dbType).update(e),o=0;return{addWhere(a){let[n,s]=V(a,++o,t.dbType);r.andWhere(n,s)},setParams(a){let n={};for(let{column:s,value:u}of a){let m=`${u}`;m.startsWith("=")?n[s]=()=>m.substring(1):n[s]=m}r.set(a)},build(){let[a,n]=r.getQueryAndParameters();return{sql:a,params:n}}}};var ar=(e,t)=>{let r=H(t.dbType).insert().into(e);return{setValues(o){let a={};for(let{column:n,value:s}of o){let u=`${s}`;u.startsWith("=")?a[n]=()=>u.substring(1):a[n]=u}r.values([a])},build(){let[o,a]=r.getQueryAndParameters();return{sql:o,params:a}}}};var xe=rr,nr=or,sr=ar;var ir=require("typeorm"),ur=async(e,t)=>{let r=await v.find({where:{tableName:(0,ir.In)(t),datasource:{id:e}}}),o=[];for(let s of r)if(s.columns)for(let u of s.columns)o.push({column:u.name,table:s.tableName||"",full:`${s.tableName}.${u.name}`,type:u.type});let a=o.reduce((s,u)=>(s[u.full]=u.type,s),{});return{getAllColumns(){return o},getColumnType:s=>a[s],hasColumn(s){return!!a[s]||s==="*"}}};async function ko(e,t,r){return b.save(b.create({user:{id:e},team:{id:t},dataSource:{id:r.datasourceId},name:r.name,opts:r.opts}))}var me=async(e,t)=>{let{datasourceId:r,size:o=20,page:a}=t,{table:n,joins:s,groupBy:u,orderBy:m}=t.opts,c=await le(r);if(!c)throw new i(404,"Datasource not found");let S=Gt(t.opts.columns,t.opts.groupBy,t.opts.aggregations),p=Yt(t.opts),l=await ur(r,p),C=l.getAllColumns(),L;S&&S.length>0?L=S:L=C.map(R=>({column:R.full})),L.forEach(R=>{if(!l.hasColumn(R.column))throw new i(400,`Invalid column ${R.column}`)});let Hr=ko(e.user.id,e.user.currentTeamId,t),x=xe(n,c);x.setLimit(o+1),x.setOffset(o*a),x.setColumns(L),s&&s.forEach(x.addJoin),m.length>0&&m.forEach(({column:R,direction:jr})=>{x.hasAlias(R)&&x.addOrderBy(ie[c.dbType].escape(R),jr)}),u&&u.length>0&&u.forEach(R=>{l.hasColumn(R.value)&&x.addGroupBy({column:R.value,fn:R.fn,distinct:R.distinct})}),Oe(t.opts.filters,l.getColumnType).forEach(R=>{R.fn&&Zt(R.fn)?x.addHaving(R):x.addWhere(R)});let{sql:Yr,params:Gr}=x.build(),J=await(await M(k(c,!0),c.dbType,e)).executeQuery({sql:Yr,params:Gr,type:"SELECT",allowBulkUpdate:!1}),De=J.rows.length>o;De&&J.rows.pop();let{id:Kr}=await Hr;return{...J,queryHistoryId:Kr,tables:p,allColumns:C,columns:Kt(L,J.columns,l.getColumnType),hasMore:De}},cr=async(e,t)=>{let r=await le(t.dataSourceId);if(!r)throw new i(400,"Invalid datasource");let o=await M(k(r,!0),r.dbType,e),a=xe(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:s}=a.build(),u=await o.executeQuery({sql:n,params:s,type:"SELECT",allowBulkUpdate:!1});if(u.rows.length>1)throw new i(400,"Found multiple rows for given query");if(u.rows.length<1)throw new i(404,"Entity not found");return{entity:u.rows[0],columns:u.columns,sql:n}},mr=async(e,t)=>{let r=await le(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=nr(t.table,r);o.setParams(t.values),Oe(t.filters,()=>"=").forEach(u=>{o.addWhere(u)});let{sql:a,params:n}=o.build();return(await M(k(r,!0),r.dbType,e)).executeQuery({sql:a,params:n,type:"UPDATE",allowBulkUpdate:!1})},lr=async(e,t)=>{let r=await le(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=sr(t.table,r);o.setValues(t.values);let{sql:a,params:n}=o.build();return(await M(k(r,!0),r.dbType,e)).executeQuery({sql:a,type:"INSERT",params:n,allowBulkUpdate:!1})};async function le(e){return I.findOne({where:{id:e},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowUpdate","allowInsert"]})}var dr=e=>{},Qo=["--",";","DROP","drop"],pr=e=>{if(typeof e.value=="string"&&e.value.startsWith("=")){let t=e.value;Qo.forEach(r=>{if(t.includes(r))throw new i(400,"Invalid input value for "+e.column)})}},fr=e=>{if(!e.table)throw new i(400,"Table is required");e.values.forEach(pr)},yr=e=>{if(!e.table)throw new i(400,"Table is required");e.values.forEach(pr)};var Tr=T(e=>{e.route({method:"post",url:"/:dsId/select",handler:async t=>{let r=f(t,dr);return{data:await me(t,r)}}}),e.route({method:"get",url:"/:dsId/entity/:table",handler:async t=>{let{dsId:r,table:o}=d(t),a=U(t);return{data:await cr(t,{table:o,dataSourceId:r,props:a})}}}),e.route({method:"post",url:"/:dsId/insert",config:{requireRole:E("editor")},handler:async t=>{let r=f(t,fr);return{data:await lr(t,r)}}}),e.route({method:"post",url:"/:dsId/update",config:{requireRole:E("editor")},handler:async t=>{let r=f(t,yr);return{data:await mr(t,r)}}})});var gr=T(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:y.str("SERVER_VERSION")}}))});var hr=T(e=>{e.route({method:"get",url:"/:id/users",handler:async t=>{let{id:r}=d(t),o=await q.findOne({where:{id:r},relations:{users:{user:!0}}});if(!o)throw new i(404,"Team not found");return{data:o.users.map(a=>({role:a.role,id:a.user.id,name:a.user.username}))}}}),e.route({method:"post",url:"/",config:{requireRole:E("editor")},handler:async t=>h.transaction(async()=>{let r=t.user.id,o=f(t),a=w.create();a.id=r;let n=q.create(o);await q.save(n);let s=N.create({user:a,team:n});return await N.save(s),{data:n}})}),e.route({method:"patch",url:"/:id/user-role",config:{requireRole:E("admin")},handler:async t=>{let{id:r}=d(t),{role:o,userId:a}=f(t,({role:s})=>{if(s==="owner")throw new i(400,"Only one owner is allowed")});if((await N.findOneBy({user:{id:a},team:{id:r}}))?.role==="owner")throw new i(400,"Cannot change owner role");await N.update({user:{id:a},team:{id:r}},{role:o})}}),e.route({method:"delete",url:"/:id",config:{requireRole:E("admin")},handler:async t=>h.transaction(async()=>{let{id:r}=d(t),{userId:o}=U(t);if((await N.findOneBy({user:{id:o},team:{id:r}}))?.role==="owner")throw new i(400,"Cannot delete team owner");await w.update(o,{currentTeam:null}),await N.delete({user:{id:o},team:{id:r}}),await w.delete({id:o})})})});var ve=O(require("bcryptjs")),z=async e=>{let t=await ve.default.genSalt(10);return ve.default.hash(e,t)};var wr=T(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:E("admin")},handler:async t=>h.transaction(async()=>{let r=f(t),o=await z(r.password),a=await w.save(w.create({username:r.username,password:o})),n=await N.save(N.create({role:"read_only",team:{id:r.teamId},user:{id:a.id}}));await w.update(a.id,{currentTeam:{id:n.id}})})})});var Sr=T(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=t.user.id,o=await $.findOneBy({user:{id:r}});return o||(o=await $.save($.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 $.update(r.id,r)).affected)throw new i(404,"You do not own these settings!");return{data:await $.findOneBy({id:r.id})}}})});function Y(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 Er=T(e=>{e.route({method:"post",url:"/",config:{requireRole:E("editor")},handler:async t=>{let r=f(t),o=await b.findOne({where:{id:r.queryId}});if(!o)throw new i(400,"Query not found");let a=await D.save(D.create({isPersonal:!1,team:{id:t.user.currentTeamId},user:{id:t.user.id},query:{id:r.queryId},searchString:Y(o.opts,r.name)}));return await b.update(r.queryId,{name:r.name}),{data:a}}}),e.route({method:"delete",url:"/:id",config:{requireRole:E("editor")},handler:async t=>{let{id:r}=d(t);if(!(await D.delete({id:r})).affected)return{status:404,data:"Query not found"}}}),e.route({method:"patch",url:"/:id",handler:async t=>await h.transaction(async()=>{let{id:r}=d(t),o=f(t,s=>{if(!s.name)throw new i(400,"Name is required")}),a=await D.findOne({where:{id:r},relations:{query:!0}});if(!a)throw new i(400,"Query not found");let n=Y(a.query.opts,o.name);return await Promise.all([D.update({id:r},{searchString:n}),b.update({id:a.query.id},{name:o.name})]),{data:!0}})})});var Ir=e=>{if(!e.queryId&&!(e.opts&&e.name))throw new i(400,"Either queryId or name and opts are required")};var br=T(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}=d(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,Ir),n,s,u=o;if(r)s=r.dataSourceId,n=r;else{let c=await b.findOne({where:{id:a},relations:{dataSource:!0}});if(!c)throw new i(404,"Query not Found");s=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||(u=c.name)}return{data:await A.save(A.create({name:u||new Date().toISOString(),opts:n,dataSource:{id:s},user:{id:t.user.id},team:{id:t.user.currentTeamId}}))}}}),e.route({method:"post",url:"/:id/run",handler:async t=>{let{id:r}=d(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:Y(o,a.name),updatedAt:new Date}),{data:{result:await me(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}=d(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=Y(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}=d(t),o=t.user.id;return await A.delete({id:r,user:{id:o}}),{data:!0}}})});var Nr=require("node:crypto");var Rr=require("node:crypto"),Cr={teamName:"Default Team",username:"admin"},Bo=async()=>{let e=await q.findOneBy({});return e||q.save(q.create({name:Cr.teamName}))},de=async e=>{let t=await N.findOne({where:{role:"owner"},relations:{user:!0}});if(t)return t.user;let r=await Bo(),o=await z(e?.password||(0,Rr.randomBytes)(32).toString("hex")),a=await w.save(w.create({username:e?.name||Cr.username,password:o})),n=await N.save(N.create({user:a,team:r,role:"owner"}));return await w.update(a.id,{currentTeam:n}),a};var pe={setupAccessToken:void 0},Ar=()=>(pe.setupAccessToken=(0,Nr.randomBytes)(32).toString("hex"),pe.setupAccessToken),Fo=e=>{if(!pe.setupAccessToken)throw new i(400,"Setup already performed");if(!e||e!==pe.setupAccessToken)throw new i(400,"Invalid setup access token")},F=async()=>_.skipAuth?!1:await w.count()<1,Pr=async e=>{Fo(e.setupAccessToken),await de({name:e.userName,password:e.userPassword})};var Or=T(e=>{e.route({method:"get",url:"/client.config.js",handler:(t,r)=>{let o={skipAuth:_.skipAuth,modeName:_.name,usesCustomDb:Qe(),serverVersion:y.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 F()?r.redirect("/setup"):r.sendFile("index.html")}),e.route({method:"get",url:"/setup",handler:async(t,r)=>await F()?r.sendFile("setup.html"):r.redirect("/")})});var _r=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 xr=T(e=>{e.route({method:"post",url:"/",config:{isPublic:!0},handler:async t=>{if(!await F())throw new i(400,"Setup has already been completed");let o=f(t,_r);return await Pr(o),{data:!0}}})});var $o=[[Or,"/"],[ct,"/api/auth"],[Ft,"/api/data-sources"],[$t,"/api/project"],[Wt,"/api/queries"],[Tr,"/api/runner"],[gr,"/api/status"],[hr,"/api/teams"],[wr,"/api/users"],[Sr,"/api/user-settings"],[Er,"/api/saved-queries"],[br,"/api/workbench-tabs"],[xr,"/api/setup"]],vr=e=>{for(let[t,r]of $o)e.register(t,{prefix:r}),console.log("Registered "+r)};var Wo=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),Ho=async()=>N.findOne({where:{role:"owner"},relations:{user:!0,team:!0}}),Yo=async e=>{let t=await Ho();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}},Go=async e=>{let t=e.headers.authorization;if(!t)throw new i(401,"Missing auth token");let[r,o]=t.split(" "),{userId:a}=await nt(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}},Dr=async e=>{Wo(e)||(_.skipAuth?await Yo(e):await Go(e))};var Ur=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Lr=e=>{e.addHook("onRequest",Dr),e.addHook("onRequest",Bt),e.addHook("onResponse",Ur)};var qr=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 Mr=O(require("@fastify/cookie")),kr=O(require("@fastify/cors"));var Qr=O(require("@fastify/static")),Br=require("node:path"),Fr=e=>{e.register(Mr.default,{}),e.register(kr.default,{origin:G.allowedOrigins,methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),e.register(Qr.default,{root:(0,Br.join)(__dirname,"web")})};(async function(){let t=(0,$r.default)({querystringParser:o=>Wr.default.parse(o)});if(ke(),Fr(t),Lr(t),vr(t),qr(t),await t.after(),await Xe(),t.listen({port:G.port,host:G.host},(o,a)=>{o&&(console.error(o),process.exit(1)),console.log(`Server listening at ${a}`)}),await F()){let o=Ar();console.log(`Setup access token:
58
+ ${o}`),console.log("Use the above token to finish the setup process when opening the app for the first time.")}else await de()})();