@dataramen/cli 0.0.61-beta.2 → 0.0.62-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
- "use strict";var Vt=Object.create;var _e=Object.defineProperty;var zt=Object.getOwnPropertyDescriptor;var Jt=Object.getOwnPropertyNames;var Xt=Object.getPrototypeOf,Zt=Object.prototype.hasOwnProperty;var er=(e,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Jt(t))!Zt.call(e,o)&&o!==r&&_e(e,o,{get:()=>t[o],enumerable:!(a=zt(t,o))||a.enumerable});return e};var _=(e,t,r)=>(r=e!=null?Vt(Xt(e)):{},er(t||!e||!e.__esModule?_e(r,"default",{value:e,enumerable:!0}):r,e));var X=require("dotenv"),Z=require("node:path"),De=require("node:fs"),tr=(()=>{try{let e=(0,De.readFileSync)((0,Z.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})(),Ue=[];process.argv[2]&&Ue.push((0,Z.resolve)(process.argv[2]));(0,X.config)({path:Ue});(0,X.populate)(process.env,{SERVER_VERSION:tr.version,APP_DB_TYPE:"sqlite",APP_DB_DATABASE:"<home>/.dataramen/.runtime/db.sqlite3",PROD:"true"},{override:!1});var rr=["SYMM_ENCRYPTION_KEY","JWT_SECRET","JWT_REFRESH_SECRET"],ve=()=>{let e=[];for(let t of rr)process.env[t]||e.push(t);if(e.length>0)throw new Error("Following env variables are required but not provided: "+e.join(", "))};function ar(e,t=void 0){return process.env[e]||t}function or(e,t=void 0){let r=process.env[e];if(!r)return t;let a=Number(r);return!isNaN(a)&&r.trim()!==""?a:t}function nr(e){return process.env[e]==="true"||process.env[e]==="TRUE"||process.env[e]==="1"}var y={str:ar,num:or,bool:nr};var $s=require("reflect-metadata"),Bt=_(require("fastify")),Ft=_(require("@fastify/cors")),$t=_(require("@fastify/static")),Ht=_(require("qs"));var s=class extends Error{constructor(r,a){super(a);this.status=r;this.message=a}};var He=require("typeorm");var xe=require("typeorm");var f=y.str("APP_DB_TYPE")==="sqlite"?"datetime":"timestamp";var me=new xe.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:f,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:f,default:()=>"CURRENT_TIMESTAMP"}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var Me=require("typeorm");var le=new Me.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:f,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:f,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 Le=require("typeorm");var pe=new Le.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:f,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:f,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 ke=require("typeorm");var fe=new ke.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:f,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:f,default:()=>"CURRENT_TIMESTAMP"}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var qe=require("typeorm");var ye=new qe.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:f,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:f,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:f,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 We=_(require("node:os")),Ye=require("node:path");var Qe=require("typeorm");var Te=new Qe.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",default:"{}"},createdAt:{type:f,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:f,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 Be=require("typeorm"),he=new Be.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 Fe=require("typeorm");var ge=new Fe.EntitySchema({name:"SavedQuery",tableName:"saved_queries",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},isPersonal:{type:Boolean},createdAt:{type:f,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:f,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 $e=require("typeorm");var we=new $e.EntitySchema({name:"WorkbenchTab",tableName:"workbench_tabs",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:f,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:f,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 sr(){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>",We.default.homedir())),e}var T=new He.DataSource({type:y.str("APP_DB_TYPE"),database:sr(),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:[Ye.posix.join(__dirname,"migrations","*.js")],entities:[me,ye,le,pe,he,fe,Te,ge,we]}),je=async()=>{if(!T.isInitialized)return T.initialize();throw new Error("Already initialized")},U=T.getRepository(me),E=T.getRepository(ye),M=T.getRepository(le),R=T.getRepository(pe),N=T.getRepository(he),$=T.getRepository(fe),I=T.getRepository(Te),v=T.getRepository(ge),A=T.getRepository(we);var h=e=>(t,r,a)=>{e(t),a()};var Y=require("jose");var Ge=new TextEncoder,Ke=Ge.encode(y.str("JWT_SECRET")),Ve=Ge.encode(y.str("JWT_REFRESH_SECRET")),Se=async({userId:e})=>new Y.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign(Ke),Ee=async({userId:e})=>new Y.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign(Ve),ze=async(e,t)=>{try{let{payload:r}=await(0,Y.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")}},Je=async e=>ze(e,Ke),Xe=async e=>ze(e,Ve);var m=(e,t)=>{let r=e.body;return t&&t(r),r},L=(e,t)=>{let r=e.query;return t&&t(r),r},l=(e,t)=>{let r=e.params;return t&&t(r),r};var et=_(require("bcryptjs"));var Ze=e=>{if(!e?.username)throw new s(400,"Username is required");if(!e?.password)throw new s(400,"Password is required")};var ee="DATARAMEN_refresh_token",be={httpOnly:!0,secure:y.bool("PROD"),sameSite:y.bool("PROD"),path:"/",maxAge:10*24*60*60},tt=h(e=>{e.route({method:"post",url:"/login",config:{isPublic:!0},handler:async(t,r)=>{let{username:a,password:o}=m(t,Ze),n=await R.findOne({where:{username:a}});if(!n||!et.default.compareSync(o,n.password))throw new s(401,"Invalid credentials");let[i,u]=await Promise.all([Se({userId:n?.id}),Ee({userId:n?.id})]);return r.setCookie(ee,u,be),{data:{accessToken:i}}}}),e.route({method:"post",url:"/refresh",config:{isPublic:!0},handler:async(t,r)=>{let a=t.cookies[ee];if(!a)return r.code(401).send({message:"Missing refresh token"});let{userId:o}=await Xe(a),[n,i]=await Promise.all([Se({userId:o}),Ee({userId:o})]);return r.setCookie(ee,i,be),{data:{accessToken:n}}}}),e.route({method:"post",url:"/logout",config:{isPublic:!0},handler:async(t,r)=>(r.clearCookie(ee,be),{data:!0})})});var rt=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 ot=_(require("mysql2/promise"));var ir=({database:e,password:t,user:r,url:a})=>ot.default.createConnection({host:a,user:r,database:e,password:t}),ur=async e=>{let t=`
1
+ "use strict";var zt=Object.create;var De=Object.defineProperty;var Jt=Object.getOwnPropertyDescriptor;var Xt=Object.getOwnPropertyNames;var Zt=Object.getPrototypeOf,er=Object.prototype.hasOwnProperty;var tr=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of Xt(t))!er.call(e,a)&&a!==r&&De(e,a,{get:()=>t[a],enumerable:!(o=Jt(t,a))||o.enumerable});return e};var D=(e,t,r)=>(r=e!=null?zt(Zt(e)):{},tr(t||!e||!e.__esModule?De(r,"default",{value:e,enumerable:!0}):r,e));var Z=require("dotenv"),ee=require("node:path"),Ue=require("node:fs"),rr=(()=>{try{let e=(0,Ue.readFileSync)((0,ee.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})(),ve=[];process.argv[2]&&ve.push((0,ee.resolve)(process.argv[2]));(0,Z.config)({path:ve});(0,Z.populate)(process.env,{SERVER_VERSION:rr.version,APP_DB_TYPE:"sqlite",APP_DB_DATABASE:"<home>/.dataramen/.runtime/db.sqlite3",PROD:"true"},{override:!1});var or=["SYMM_ENCRYPTION_KEY","JWT_SECRET","JWT_REFRESH_SECRET"],xe=()=>{let e=[];for(let t of or)process.env[t]||e.push(t);if(e.length>0)throw new Error("Following env variables are required but not provided: "+e.join(", "))};function ar(e,t=void 0){return process.env[e]||t}function nr(e,t=void 0){let r=process.env[e];if(!r)return t;let o=Number(r);return!isNaN(o)&&r.trim()!==""?o:t}function sr(e){return process.env[e]==="true"||process.env[e]==="TRUE"||process.env[e]==="1"}var T={str:ar,num:nr,bool:sr};var Ws=require("reflect-metadata"),Bt=D(require("fastify")),Ft=D(require("@fastify/cors")),$t=D(require("@fastify/static")),Ht=D(require("qs"));var s=class extends Error{constructor(r,o){super(o);this.status=r;this.message=o}};var We=require("typeorm");var Me=require("typeorm");var y=T.str("APP_DB_TYPE")==="sqlite"?"datetime":"timestamp";var me=new Me.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:y,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:y,default:()=>"CURRENT_TIMESTAMP"}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var Le=require("typeorm");var le=new Le.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:y,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:y,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 ke=require("typeorm");var pe=new ke.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:y,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:y,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 qe=require("typeorm");var fe=new qe.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:y,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:y,default:()=>"CURRENT_TIMESTAMP"}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var Qe=require("typeorm");var ye=new Qe.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:y,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:y,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:y,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 Ye=D(require("node:os")),je=require("node:path");var Be=require("typeorm");var Te=new Be.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",default:"{}"},createdAt:{type:y,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:y,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 Fe=require("typeorm"),he=new Fe.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 $e=require("typeorm");var ge=new $e.EntitySchema({name:"SavedQuery",tableName:"saved_queries",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},isPersonal:{type:Boolean},createdAt:{type:y,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:y,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 He=require("typeorm");var we=new He.EntitySchema({name:"WorkbenchTab",tableName:"workbench_tabs",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:y,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:y,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 ir(){let e=T.str("APP_DB_DATABASE");if(!e)throw new Error("Bad value for TYPEORM_DATABASE. Please check your config!");return e.startsWith("<home>")&&(e=e.replace("<home>",Ye.default.homedir())),e}var h=new We.DataSource({type:T.str("APP_DB_TYPE"),database:ir(),host:T.str("APP_DB_HOST"),username:T.str("APP_DB_USERNAME"),password:T.str("APP_DB_PASSWORD"),port:T.num("APP_DB_PORT"),schema:T.str("APP_DB_SCHEMA"),logging:T.bool("APP_DB_LOGGING"),migrationsRun:!0,migrations:[je.posix.join(__dirname,"migrations","*.js")],entities:[me,ye,le,pe,he,fe,Te,ge,we]}),Ge=async()=>{if(!h.isInitialized)return h.initialize();throw new Error("Already initialized")},v=h.getRepository(me),E=h.getRepository(ye),M=h.getRepository(le),R=h.getRepository(pe),N=h.getRepository(he),$=h.getRepository(fe),I=h.getRepository(Te),x=h.getRepository(ge),A=h.getRepository(we);var g=e=>(t,r,o)=>{e(t),o()};var j=require("jose");var Ke=new TextEncoder,Ve=Ke.encode(T.str("JWT_SECRET")),ze=Ke.encode(T.str("JWT_REFRESH_SECRET")),Se=async({userId:e})=>new j.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign(Ve),Ee=async({userId:e})=>new j.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign(ze),Je=async(e,t)=>{try{let{payload:r}=await(0,j.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")}},Xe=async e=>Je(e,Ve),Ze=async e=>Je(e,ze);var l=(e,t)=>{let r=e.body;return t&&t(r),r},L=(e,t)=>{let r=e.query;return t&&t(r),r},p=(e,t)=>{let r=e.params;return t&&t(r),r};var tt=D(require("bcryptjs"));var et=e=>{if(!e?.username)throw new s(400,"Username is required");if(!e?.password)throw new s(400,"Password is required")};var te="DATARAMEN_refresh_token",be={httpOnly:!0,secure:T.bool("PROD"),sameSite:T.bool("PROD"),path:"/",maxAge:10*24*60*60},rt=g(e=>{e.route({method:"post",url:"/login",config:{isPublic:!0},handler:async(t,r)=>{let{username:o,password:a}=l(t,et),n=await R.findOne({where:{username:o}});if(!n||!tt.default.compareSync(a,n.password))throw new s(401,"Invalid credentials");let[i,u]=await Promise.all([Se({userId:n?.id}),Ee({userId:n?.id})]);return r.setCookie(te,u,be),{data:{accessToken:i}}}}),e.route({method:"post",url:"/refresh",config:{isPublic:!0},handler:async(t,r)=>{let o=t.cookies[te];if(!o)return r.code(401).send({message:"Missing refresh token"});let{userId:a}=await Ze(o),[n,i]=await Promise.all([Se({userId:a}),Ee({userId:a})]);return r.setCookie(te,i,be),{data:{accessToken:n}}}}),e.route({method:"post",url:"/logout",config:{isPublic:!0},handler:async(t,r)=>(r.clearCookie(te,be),{data:!0})})});var ot=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 nt=D(require("mysql2/promise"));var ur=({database:e,password:t,user:r,url:o})=>nt.default.createConnection({host:o,user:r,database:e,password:t}),cr=async e=>{let t=`
2
2
  SELECT 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),a={};return r.forEach(o=>{let n=o.TABLE_NAME,i=o.COLUMN_NAME;a[n]||(a[n]=[]),a[n].push(i)}),a},cr=async e=>{let t=`
6
+ `,[r]=await e.execute(t),o={};return r.forEach(a=>{let n=a.TABLE_NAME,i=a.COLUMN_NAME;o[n]||(o[n]=[]),o[n].push(i)}),o},dr=async e=>{let t=`
7
7
  SELECT
8
8
  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),a={};return Array.isArray(r)&&r.forEach(o=>{a[o.table_name]||(a[o.table_name]={}),a[o.table_name][o.field]={refTable:o.referenced_table,refField:o.referenced_field}}),a},dr=async(e,t)=>{let a=(await t.query("SHOW TABLES"))[0],o=await cr(t),n=await ur(t),i=a.map(async u=>{let p=Object.values(u)[0],c=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${e.database}' and table_name = '${p}'`,[S]=await t.query(c),C=o[p];return{columns:S.map(d=>({name:d.COLUMN_NAME,type:d.DATA_TYPE,isPrimary:n[p]?.includes(d.COLUMN_NAME),ref:C?.[d.COLUMN_NAME]?{table:C[d.COLUMN_NAME].refTable,field:C[d.COLUMN_NAME].refField}:void 0})).sort((d,g)=>d.isPrimary&&g.isPrimary?d.name.localeCompare(g.name):d.isPrimary?-1:1),createdAt:new Date,tableName:p,updatedAt:new Date}});return Promise.all(i)},at=async(e,t,r)=>{try{console.log(`[MYSQL CONN] Query: ${e}`);let[a,o]=await t.query({sql:e,rowsAsArray:!0}),n=a?.constructor?.name;if(n==="ResultSetHeader"){let i=a;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=a;return{columns:o?.map(u=>({column:u.orgName||u.name,table:u.orgTable,alias:u.name,full:u.orgTable?u.orgTable+"."+u.orgName:u.name}))||[],rows:i,query:e}}throw new Error(`[MYSQL CONN] Unknown result type: ${n}`)}catch(a){throw console.error(a),a instanceof s?a:new s(400,a.message)}},mr=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}},lr=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}},nt=async e=>{let t=await ir(e),r=!1;return{dbType:"mysql",dataSource:e,inspectSchema:()=>dr(e,t),executeQuery:(a,o)=>o.type==="SELECT"?lr(t,()=>at(a,t,o)):mr(t,()=>at(a,t,o)),checkConnection:async()=>t.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.destroy()}}};var it=_(require("pg"));var pr=async({database:e,password:t,user:r,url:a,port:o})=>{let n=new it.default.Client({host:a,user:r,database:e,password:t,port:o,query_timeout:1e4});return await n.connect(),n},fr=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},mr=async(e,t)=>{let o=(await t.query("SHOW TABLES"))[0],a=await dr(t),n=await cr(t),i=o.map(async u=>{let f=Object.values(u)[0],c=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${e.database}' and table_name = '${f}'`,[S]=await t.query(c),C=a[f];return{columns:S.map(d=>({name:d.COLUMN_NAME,type:d.DATA_TYPE,isPrimary:n[f]?.includes(d.COLUMN_NAME),ref:C?.[d.COLUMN_NAME]?{table:C[d.COLUMN_NAME].refTable,field:C[d.COLUMN_NAME].refField}:void 0})).sort((d,w)=>d.isPrimary&&w.isPrimary?d.name.localeCompare(w.name):d.isPrimary?-1:1),createdAt:new Date,tableName:f,updatedAt:new Date}});return Promise.all(i)},at=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:u.orgTable,alias:u.name,full:u.orgTable?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)}},lr=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}},pr=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 ur(e),r=!1;return{dbType:"mysql",dataSource:e,inspectSchema:()=>mr(e,t),executeQuery:(o,a)=>a.type==="SELECT"?pr(t,()=>at(o,t,a)):lr(t,()=>at(o,t,a)),checkConnection:async()=>t.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.destroy()}}};var ut=D(require("pg"));var fr=async({database:e,password:t,user:r,url:o,port:a})=>{let n=new ut.default.Client({host:o,user:r,database:e,password:t,port:a,query_timeout:1e4});return await n.connect(),n},yr=async e=>{let r=await e.query(`
18
18
  SELECT
19
19
  kcu.table_name,
20
20
  kcu.column_name,
@@ -28,7 +28,7 @@
28
28
  tc.constraint_type = 'PRIMARY KEY'
29
29
  ORDER BY
30
30
  kcu.table_name, kcu.ordinal_position;
31
- `),a={};return r.rows.forEach(o=>{let n=o.table_name,i=o.column_name;a[n]||(a[n]=[]),a[n].push(i)}),a},yr=async e=>{let r=await e.query(`
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},Tr=async e=>{let r=await e.query(`
32
32
  SELECT
33
33
  tc.table_name AS table_name,
34
34
  kcu.column_name AS field,
@@ -43,15 +43,15 @@
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
- `),a={};return r.rows.forEach(o=>{a[o.table_name]||(a[o.table_name]={}),a[o.table_name][o.field]={refTable:o.referenced_table,refField:o.referenced_field}}),a},Tr=async(e,t)=>{let r=`SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = '${e.schema}'`,o=(await t.query(r)).rows,n=await yr(t),i=await fr(t),u=o.map(async p=>{let c=Object.values(p)[0],S=`
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},hr=async(e,t)=>{let r=`SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = '${e.schema}'`,a=(await t.query(r)).rows,n=await Tr(t),i=await yr(t),u=a.map(async f=>{let c=Object.values(f)[0],S=`
47
47
  SELECT column_name, data_type
48
48
  FROM information_schema.columns
49
49
  WHERE
50
50
  table_name = '${c}' and
51
51
  table_schema = '${e.schema}'
52
- `,{rows:C}=await t.query(S),d=n[c];return{columns:C.map(g=>({name:g.column_name,type:g.data_type,isPrimary:i[c]?.includes(g.column_name),ref:d?.[g.column_name]?{table:d[g.column_name].refTable,field:d[g.column_name].refField}:void 0})).sort((g,F)=>g.isPrimary&&F.isPrimary?g.name.localeCompare(F.name):g.isPrimary?-1:1),createdAt:new Date,tableName:c,updatedAt:new Date}});return Promise.all(u)},hr=async(e,t)=>{let r=`select relname, attname, concat(pg_class.oid, '-', attnum) as row_key
52
+ `,{rows:C}=await t.query(S),d=n[c];return{columns:C.map(w=>({name:w.column_name,type:w.data_type,isPrimary:i[c]?.includes(w.column_name),ref:d?.[w.column_name]?{table:d[w.column_name].refTable,field:d[w.column_name].refField}:void 0})).sort((w,F)=>w.isPrimary&&F.isPrimary?w.name.localeCompare(F.name):w.isPrimary?-1:1),createdAt:new Date,tableName:c,updatedAt:new Date}});return Promise.all(u)},gr=async(e,t)=>{let r=`select 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 25;`;return(await t.query(r)).rows.reduce((o,n)=>(o[n.row_key]={table:n.relname,column:n.attname},o),{})},st=async(e,t,r)=>{try{console.log(`[PG CONN] Query: ${e}`);let{rows:a,fields:o,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=o.map(c=>`'${c.tableID}-${c.columnID}'`),p=await hr(u,t);return{columns:o.map(c=>{let S=p[`${c.tableID}-${c.columnID}`];return{column:S?.column||c.name,alias:c.name,table:S?.table||"",full:S?S.table+"."+S.column:c.name}}),rows:a,query:e}}throw new Error(`[PG CONN] Unsupported command: ${n}`)}catch(a){throw a instanceof s?a:new s(400,a.message)}},gr=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}},wr=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}},ut=async e=>{let t=await pr(e),r=!1,a=!1,o=async n=>(a||await t.query(`SET search_path TO ${e.schema}`),n());return{dbType:"postgres",dataSource:e,inspectSchema:()=>Tr(e,t),executeQuery:(n,i)=>o(()=>i.type==="SELECT"?wr(t,()=>st(n,t,i)):gr(t,()=>st(n,t,i))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.end()}}};var k=async(e,t,r)=>{try{let a;if(t==="mysql")a=await nt(e);else if(t==="postgres")a=await ut(e);else throw new s(500,`Connection manager for ${t} not found`);return r.__connections?r.__connections.push(a):r.__connections=[a],a}catch(a){throw console.error(a),a instanceof s?a:a?.code==="ECONNREFUSED"?new s(500,"Failed to connect to the database"):new s(500,a.message)}};var te=_(require("node:crypto"));var ct="aes-256-gcm",Sr=12,dt=()=>{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},Er=e=>{let t=te.default.randomBytes(Sr),r=dt(),a=te.default.createCipheriv(ct,r,t),o=a.update(e,"utf8","hex");o+=a.final("hex");let n=a.getAuthTag();return{encrypted:o,iv:t.toString("hex"),tag:n.toString("hex")}},br=({encrypted:e,iv:t,tag:r})=>{let a=dt(),o=te.default.createDecipheriv(ct,a,Buffer.from(t,"hex"));o.setAuthTag(Buffer.from(r,"hex"));let n=o.update(e,"hex","utf8");return n+=o.final("utf8"),n},re={encrypt:Er,decrypt:br};var q=(e,t=!1)=>{if(t){let r=re.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 mt=[{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"}],Rr=mt.reduce((e,t)=>(e[t.value]=t.label,e),{}),oo=mt.reduce((e,t)=>(e[t.label]=t.value,e),{}),H=e=>e.map(t=>({label:Rr[t],value:t})),no=H(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),so=H(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),io=H(["=","<>","IS NULL","IS NOT NULL"]),uo=H(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),co=H(["IS NULL","IS NOT NULL"]),mo=H(["IN","NOT IN"]);var lt=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"];var lo=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var Re=e=>e.fn?e.distinct===!0?`${e.fn} distinct ${e.value}`:`${e.fn} ${e.value}`:e.value;var Ie={read_only:10,editor:20,admin:30,owner:40};var b=e=>{let t=Ie[e];return r=>Ie[r.currentTeamRole]>=t},pt=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 ft=h(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=l(t),a=await E.findOne({where:{id:r}});if(!a)throw new s(404,"Data source not found");return{data:a}}}),e.route({method:"get",url:"/",handler:async t=>{let{teamId:r}=L(t);return{data:await E.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",config:{requireRole:b("admin")},handler:async t=>{let{teamId:r,ownerId:a,...o}=m(t,rt),n=E.create({...o,allowUpdate:!!o.allowUpdate,allowInsert:!!o.allowInsert,team:{id:r},owner:{id:a}}),i=await k(q(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:p,encrypted:c}=re.encrypt(n.dbPassword);return n.dbPassword=c,n.dbPasswordIv=p,n.dbPasswordTag=u,{data:await E.save(n)}}}),e.route({method:"put",url:"/:id",config:{requireRole:b("admin")},handler:async t=>{let{id:r}=l(t),a=m(t),o=await E.findOneBy({id:r});if(!o)throw new s(404,"Data source not found");let n=E.merge(o,a);return await E.save(n),{data:n}}}),e.route({method:"delete",url:"/:id",config:{requireRole:b("admin")},handler:async(t,r)=>T.transaction(async()=>{let{id:a}=l(t);await Promise.all([U.delete({datasource:{id:a}}),I.delete({dataSource:{id:a}})]),await E.delete({id:a})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:a}=l(t),o=await E.findOne({where:{id:a},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]});if(!o)throw new Error("Data source not found");o.status="INSPECTING",await E.save(o);let i=await(await k(q(o,!0),o.dbType,t)).inspectSchema();await U.delete({datasource:{id:a}}),await U.insert(i.sort().map(u=>U.create({tableName:u.tableName,columns:u.columns,datasource:{id:a}}))),o.status="READY",o.lastInspected=new Date,await E.save(o)}}),e.route({method:"get",url:"/:id/inspections",handler:async t=>{let{id:r}=l(t);return{data:await U.find({where:{datasource:{id:r}}})}}})});var B=require("typeorm"),yt=h(e=>{e.route({method:"get",url:"/team/:teamId/datasources",handler:async t=>{let{teamId:r}=l(t);return{data:await E.find({where:{team:{id:r}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0,dbType:!0,description:!0,allowInsert:!0,allowUpdate:!0}})}}}),e.route({method:"get",url:"/team/:teamId/queries",handler:async t=>{let a=l(t).teamId||t.user.currentTeamId;return{data:(await v.find({where:[{isPersonal:!1,team:{id:a}},{isPersonal:!0,team:{id:a},user:{id:t.user.id}}],relations:{query:!0},select:{id:!0,query:{id:!0,name:!0,updatedAt:!0}}})).map(i=>({name:i.query.name,id:i.query.id,updatedAt:i.query.updatedAt,savedQueryId:i.id}))}}}),e.route({method:"get",url:"/team/:teamId/query",handler:async t=>{let{teamId:r}=l(t),{search:a,size:o,selectedDataSources:n}=L(t),i=a.length>3?parseInt(o)||20:8,u={};n?.length&&(u.id=(0,B.In)(n));let[p,c,S]=await Promise.all([U.find({where:{tableName:(0,B.Raw)(d=>`LOWER(${d}) LIKE :search`,{search:`%${a.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,B.Like)(`%${a.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}),v.find({where:{searchString:(0,B.Like)(`%${a.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})]),C=[];return p.forEach(d=>{C.push({name:d.tableName,id:d.id,dataSourceName:d.datasource?.name||"--",dataSourceId:d.datasource?.id||"--",type:"table"})}),c.forEach(d=>{C.push({name:d.name,id:d.id,dataSourceName:d.dataSource?.name||"--",dataSourceId:d.dataSource?.id||"--",type:"tab"})}),S.forEach(d=>{C.push({name:d.query.name,id:d.query.id,dataSourceName:d.query.dataSource?.name||"--",dataSourceId:d.query.dataSource?.id||"--",type:"query"})}),{data:C}}}),e.route({method:"get",url:"/team/:teamId/tabs-history",handler:async t=>{let{teamId:r}=l(t),a=L(t),o=Number(a.page),n=Number(a.size),i=t.user.id,u=await A.find({where:{team:{id:r},user:{id:i}},relations:{dataSource:!0},order:{updatedAt:"DESC"},take:n+1,skip:o*n}),p=!1;return u.length>n&&(u.pop(),p=!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:p}}})});var Tt=h(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=l(t),a=await I.findOne({where:{id:r},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return a?{data:a}:{status:404,data:"Query not found"}}}),e.route({method:"post",url:"/",config:{requireRole:b("editor")},handler:async t=>{let r=m(t),a=await E.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await I.save(I.create({name:r.name,opts:r.opts,team:{id:a?.team.id},dataSource:{id:r.dataSourceId},user:{id:t.user.id}}))}}}),e.route({method:"patch",url:"/:id",config:{requireRole:b("editor")},handler:async t=>{let{id:r}=l(t),a=m(t);if(!(await I.update(r,a)).affected)throw new s(404,"Query not found");return{data:await I.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",config:{requireRole:b("editor")},handler:async t=>T.transaction(async()=>{let{id:r}=l(t);if(!(await I.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var ae=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`},j={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:ae,MAX:ae,MIN:ae,COUNT:ae};var oe=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`},G={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:oe,MAX:oe,MIN:oe,COUNT:oe};var ht=["SUM","COUNT","AVG","MAX","MIN"],Ir=["YEAR","MONTH","DAY",...ht],Cr=Ir.reduce((e,t)=>(e[t]=!0,e),{}),Nr=ht.reduce((e,t)=>(e[t]=!0,e),{}),ne=e=>Cr[e],gt=e=>Nr[e],wt=(e,t)=>e.fn&&ne(e.fn)?(t==="postgres"?j:G)[e.fn](e):e.value;var se=e=>typeof e=="string",St=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((o,n)=>(o[n.column]=n.direction,o),{}),a=Object.entries(r).map(([o,n])=>`${o} ${n}`);t+=` ORDER BY ${a.join(", ")}`}return e.limit!==void 0&&(t+=` LIMIT ${e.limit}`),e.offset!==void 0&&(t+=` OFFSET ${e.offset}`),t},K=(e,t)=>{let{column:r,operator:a,value:o,fn:n}=e,i=wt({value:r,fn:n},t);switch(a){case"IS NULL":case"IS NOT NULL":return`${i} ${a}`;case"IN":case"NOT IN":let u=o?.map(d=>se(d.value)?`'${d.value}'`:d.value).join(", ");return`${i} ${a} (${u})`;case"LIKE":return`${i} ${t==="postgres"?"ILIKE":"LIKE"} '%${o?.[0].value}%'`;case"NOT LIKE":return`${i} ${t==="postgres"?"NOT ILIKE":"NOT LIKE"} '%${o?.[0].value}%'`;default:let S=o?.[0],C;return se(S?.value)&&S?.isColumn!==!0?C=`'${S?.value}'`:C=S?.value,`${i} ${a} ${C}`}};var ie=class{constructor(t="mysql"){this.dialect=t,this.skeleton={type:"SELECT"}}addWhere(t){let r=K(t,this.dialect);if(t.isEnabled!==!1)if(this.skeleton.where){let a=t.connector||"AND";this.skeleton.where+=` ${a} ${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=K(t,this.dialect);if(t.isEnabled!==!1)if(this.skeleton.having){let a=t.connector||"AND";this.skeleton.having+=` ${a} ${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(a=>a===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 St(this.skeleton)}};var bt=require("typeorm");var ue=async(e,t)=>{let{datasourceId:r,size:a=20,page:o,name:n}=t,{table:i,filters:u,joins:p,groupBy:c,searchAll:S,orderBy:C}=t.opts,d=Dr(t.opts.columns,t.opts.groupBy,t.opts.aggregations),g=await E.findOne({where:{id:r},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]}),F=[i],z=[];if(!g)throw new s(404,"Data source not found");let Gt=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 ie(g.dbType);P.setTable(i),P.setLimit(a+1),P.setOffset(a*o),u?.forEach(w=>{w.fn&&gt(w.fn)?P.addHaving(w):P.addWhere(w)}),p&&(P.addJoin(...p),p.forEach(w=>{F.push(w.table)}));let Oe=_r(d,C,g.dbType);Oe.length>0&&P.addOrderBy(...Oe),c&&c.length>0&&c.forEach(w=>P.addGroupBy(Pr(w,g.dbType)));let Kt=await U.find({where:{tableName:(0,bt.In)(F),datasource:{id:r}}});for(let w of Kt)if(w.columns)for(let x of w.columns)z.push({column:x.name,table:w.tableName||"",full:`${w.tableName}.${x.name}`,type:x.type});let J;if(d&&d.length>0?J=d.map(w=>Or(w,g.dbType)):J=z.map(w=>`${w.full} as "${w.full}"`),P.selectColumns(J),S){let w=z.filter(x=>lt.includes(x.type)&&J.some(de=>de.startsWith(x.full)));if(w.length>0){let x=w.map(de=>`LOWER(${de.full}) LIKE '%${S.toLowerCase()}%'`);P.addWhereRaw(`(${x.join(" OR ")})`,"AND")}}let ce=await(await k(q(g,!0),g.dbType,e)).executeQuery(P.toSQL(),{type:"SELECT",allowBulkUpdate:!1}),Pe=ce.rows.length>a;return Pe&&ce.rows.pop(),{...ce,queryHistoryId:Gt.id,tables:F,allColumns:z,hasMore:Pe}},Rt=async(e,t)=>{let r=await E.findOne({where:{id:t.datasourceId},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowUpdate"]});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 a=t.values.map(({value:u,column:p})=>typeof u=="string"?u&&u.startsWith("=")?`${p}=${u.substring(1)}`:`${p}='${u}'`:`${p}='${u}'`).join(", "),o=t.filters.map(u=>K(u,r.dbType)).join(" AND "),n=`UPDATE ${t.table} SET ${a} WHERE ${o}`;return(await k(q(r,!0),r.dbType,e)).executeQuery(n,{type:"UPDATE",allowBulkUpdate:!1})},It=async(e,t)=>{let r=await E.findOne({where:{id:t.datasourceId},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowInsert"]});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:a,values:o}=Ar(t.values),n=`INSERT INTO ${t.table} (${a}) VALUES (${o})`;return(await k(q(r,!0),r.dbType,e)).executeQuery(n,{type:"INSERT",allowBulkUpdate:!1})},Ar=e=>{let t=e.map(({column:a})=>a).join(", "),r=e.map(({value:a})=>typeof a=="string"?a&&a.startsWith("=")?a.substring(1):`'${a}'`:a).join(", ");return{keys:t,values:r}},Or=(e,t)=>{if(e.fn){if(ne(e.fn))return`${(t==="postgres"?j:G)[e.fn](e)} as "${Re(e)}"`;throw new Error("Function not allowed: "+e.fn)}return`${e.value} as "${e.value}"`},Pr=(e,t)=>{if(e.fn){if(ne(e.fn))return(t==="postgres"?j:G)[e.fn]({...e,value:Et(e.value,t)});throw new Error("Function not allowed: "+e.fn)}return Et(e.value,t)},Ce=(e,t)=>t==="postgres"?`"${e}"`:t==="mysql"?`\`${e}\``:e,Et=(e,t)=>{let[r,a]=e.split(".");return Ce(r,t)+"."+Ce(a,t)},_r=(e,t,r)=>{if(e&&e.length>0){let a=e.reduce((o,n)=>(o.set(Re(n),{isFn:!!(n.fn||n.distinct)}),o),new Map);t=t.filter(o=>a.has(o.column)).map(o=>a.get(o.column)?.isFn?{...o,column:Ce(o.column,r)}:o)}return t},Dr=(e,t,r)=>{let a=[];return t.length>0||r.length>0?a.push(...t,...r):e.length>0&&a.push(...e),a};var Ct=e=>{},Ur=["--",";","DROP","drop"],Nt=e=>{if(se(e.value)&&e.value.startsWith("=")){let t=e.value;Ur.forEach(r=>{if(t.includes(r))throw new s(400,"Invalid input value for "+e.column)})}},At=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(Nt)},Ot=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(Nt)};var Pt=h(e=>{e.route({method:"post",url:"/select",handler:async t=>{let r=m(t,Ct);return{data:await ue(t,r)}}}),e.route({method:"post",url:"/insert",config:{requireRole:b("editor")},handler:async t=>{let r=m(t,At);return{data:await It(t,r)}}}),e.route({method:"post",url:"/update",config:{requireRole:b("editor")},handler:async t=>{let r=m(t,Ot);return{data:await Rt(t,r)}}})});var _t=h(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:y.str("SERVER_VERSION")}}))});var Dt=h(e=>{e.route({method:"get",url:"/:id/users",handler:async t=>{let{id:r}=l(t),a=await M.findOne({where:{id:r},relations:{users:{user:!0}}});if(!a)throw new s(404,"Team not found");return{data:a.users.map(o=>({role:o.role,id:o.user.id,name:o.user.username}))}}}),e.route({method:"post",url:"/",config:{requireRole:b("editor")},handler:async t=>T.transaction(async()=>{let r=t.user.id,a=m(t),o=R.create();o.id=r;let n=M.create(a);await M.save(n);let i=N.create({user:o,team:n});return await N.save(i),{data:n}})}),e.route({method:"patch",url:"/:id/user-role",config:{requireRole:b("admin")},handler:async t=>{let{id:r}=l(t),{role:a,userId:o}=m(t,({role:i})=>{if(i==="owner")throw new s(400,"Only one owner is allowed")});if((await N.findOneBy({user:{id:o},team:{id:r}}))?.role==="owner")throw new s(400,"Cannot change owner role");await N.update({user:{id:o},team:{id:r}},{role:a})}}),e.route({method:"delete",url:"/:id",config:{requireRole:b("admin")},handler:async t=>T.transaction(async()=>{let{id:r}=l(t),{userId:a}=L(t);if((await N.findOneBy({user:{id:a},team:{id:r}}))?.role==="owner")throw new s(400,"Cannot delete team owner");await R.update(a,{currentTeam:null}),await N.delete({user:{id:a},team:{id:r}}),await R.delete({id:a})})})});var Ne=_(require("bcryptjs")),V=async e=>{let t=await Ne.default.genSalt(10);return Ne.default.hash(e,t)};var Ut=h(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=await R.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,a=m(t);if(a.password&&(a.password=await V(a.password)),!(await R.update(r,a)).affected)throw new s(404,"User not found");let n=await R.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:b("admin")},handler:async t=>T.transaction(async()=>{let r=m(t),a=await V(r.password),o=await R.save(R.create({username:r.username,password:a})),n=await N.save(N.create({role:"read_only",team:{id:r.teamId},user:{id:o.id}}));await R.update(o.id,{currentTeam:{id:n.id}})})})});var vt=h(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=t.user.id,a=await $.findOneBy({user:{id:r}});return a||(a=await $.save($.create({user:{id:r}}))),{data:a}}}),e.route({method:"patch",url:"/",handler:async t=>{let{settings:r}=m(t);if(!r.id)throw new s(400,"Settings id is required!");if(!(await $.update(r.id,r)).affected)throw new s(404,"You do not own these settings!");return{data:await $.findOneBy({id:r.id})}}})});function W(e,...t){let r=[...t];if(e.searchAll&&r.push(e.searchAll),e.filters){for(let a of e.filters)if(a.value)for(let o of a.value)o.value&&r.push(o.value.toString())}return r.map(a=>a.toLowerCase()).join(",")}var xt=h(e=>{e.route({method:"post",url:"/",config:{requireRole:b("editor")},handler:async t=>{let r=m(t),a=await I.findOne({where:{id:r.queryId}});if(!a)throw new s(400,"Query not found");let o=await v.save(v.create({isPersonal:!1,team:{id:t.user.currentTeamId},user:{id:t.user.id},query:{id:r.queryId},searchString:W(a.opts,r.name)}));return await I.update(r.queryId,{name:r.name}),{data:o}}}),e.route({method:"delete",url:"/:id",config:{requireRole:b("editor")},handler:async t=>{let{id:r}=l(t);if(!(await v.delete({id:r})).affected)return{status:404,data:"Query not found"}}}),e.route({method:"patch",url:"/:id",handler:async t=>await T.transaction(async()=>{let{id:r}=l(t),a=m(t,i=>{if(!i.name)throw new s(400,"Name is required")}),o=await v.findOne({where:{id:r},relations:{query:!0}});if(!o)throw new s(400,"Query not found");let n=W(o.query.opts,a.name);return await Promise.all([v.update({id:r},{searchString:n}),I.update({id:o.query.id},{name:a.name})]),{data:!0}})})});var Mt=e=>{if(!e.queryId&&!(e.opts&&e.name))throw new s(400,"Either queryId or name and opts are required")};var Lt=h(e=>{e.route({method:"get",url:"/",handler:async t=>{let{currentTeamId:r,id:a}=t.user;return{data:(await A.find({where:{team:{id:r},user:{id:a},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}=l(t),{currentTeamId:a,id:o}=t.user,n=await A.findOne({where:{id:r,team:{id:a},user:{id:o}}});if(!n)throw new s(404,"Not Found");return{data:n}}}),e.route({method:"post",url:"/",handler:async t=>{let{opts:r,name:a,queryId:o}=m(t,Mt),n,i,u=a;if(r)i=r.dataSourceId,n=r;else{let c=await I.findOne({where:{id:o},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},a||(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}=l(t),a=m(t),o=await A.findOne({where:{id:r},relations:{user:!0}});if(!o)throw new s(404,"Not found");if(o.user?.id!==t.user.id)throw new s(404,"Not found");return a&&A.update(r,{opts:a,searchString:W(a,o.name),updatedAt:new Date}),{data:{result:await ue(t,{datasourceId:a.dataSourceId,size:a.size,name:o.name,page:a.page,opts:{table:a.table,filters:a.filters,joins:a.joins,orderBy:a.orderBy,columns:a.columns,groupBy:a.groupBy,searchAll:a.searchAll,aggregations:a.aggregations}})}}}}),e.route({method:"patch",url:"/:id",handler:async t=>{let{id:r}=l(t),a=m(t),o=await A.findOne({where:{id:r,user:{id:t.user.id}}});if(!o)throw new s(404,"Not Found");let n=o.searchString;return a.name&&(n=W(o.opts,a.name)),await A.update(r,{...a,searchString:n}),{data:{id:r}}}}),e.route({method:"delete",url:"/:id",handler:async t=>{let{id:r}=l(t),a=t.user.id;return await A.delete({id:r,user:{id:a}}),{data:!0}}})});var Wt=require("node:path");var vr=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),kt=async e=>{if(vr(e))return;let t=e.headers.authorization;if(!t)throw new s(401,"Missing auth token");let[r,a]=t.split(" ");try{let{userId:o}=await Je(a),n=await R.findOne({where:{id:o},select:{id:!0,currentTeam:{role:!0,team:{id:!0}}},relations:{currentTeam:{team:!0}}});if(!n)throw new s(401,"User is not part of a team");e.user={id:o,currentTeamId:n.currentTeam.team.id,currentTeamRole:n.currentTeam.role}}catch{throw new s(401,"Unauthorized")}};var qt=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Yt=_(require("@fastify/cookie"));var Ae={teamName:"Default Team",username:"admin",password:"admin"},xr=async()=>{let e=await M.findOneBy({});return e||M.save(M.create({name:Ae.teamName}))},Qt=async()=>{let e=await N.findOne({where:{role:"owner"},relations:{user:!0}});if(e)return e.user;let t=await xr(),r=await V(Ae.password),a=await R.save(R.create({username:Ae.username,password:r})),o=await N.save(N.create({user:a,team:t,role:"owner"}));return await R.update(a.id,{currentTeam:o}),a};var O=(0,Bt.default)({querystringParser:e=>Ht.default.parse(e)}),jt=y.num("PORT",4466),Mr=y.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),Lr="0.0.0.0",kr=[`http://localhost:${jt}`,...Mr];function D(e,t){O.register(e,{prefix:t}),console.log("Registered "+t)}(async function(){ve(),await O.register(Yt.default,{}),await O.register(Ft.default,{origin:(t,r)=>{!t||kr.includes(t)?r(null,!0):r(new Error("Not allowed by CORS"),!1)},methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),await O.register($t.default,{root:(0,Wt.join)(__dirname,"web")}),O.get("/",(t,r)=>{r.sendFile("index.html")}),O.addHook("onRequest",kt),O.addHook("onRequest",pt),O.addHook("onResponse",qt),D(tt,"/api/auth"),D(ft,"/api/data-sources"),D(yt,"/api/project"),D(Tt,"/api/queries"),D(Pt,"/api/runner"),D(_t,"/api/status"),D(Dt,"/api/teams"),D(Ut,"/api/users"),D(vt,"/api/user-settings"),D(xt,"/api/saved-queries"),D(Lt,"/api/workbench-tabs"),O.setNotFoundHandler((t,r)=>{if(t.raw.url?.startsWith("/api/")){r.code(404).send({error:"API route not found"});return}r.sendFile("index.html")}),O.setErrorHandler((t,r,a)=>{if(console.error(t),t instanceof s){a.status(t.status).send({error:t.message});return}else a.status(500).send({error:"Internal Server Error"})}),await O.after(),await je(),await Qt(),O.listen({port:jt,host:Lr},(t,r)=>{t&&(console.error(t),process.exit(1)),console.log(`Server listening at ${r}`)})})();
57
+ limit 25;`;return(await t.query(r)).rows.reduce((a,n)=>(a[n.row_key]={table:n.relname,column:n.attname},a),{})},it=async(e,t,r)=>{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}'`),f=await gr(u,t);return{columns:a.map(c=>{let S=f[`${c.tableID}-${c.columnID}`];return{column:S?.column||c.name,alias:c.name,table:S?.table||"",full:S?S.table+"."+S.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)}},wr=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}},Sr=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}},ct=async e=>{let t=await fr(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:()=>hr(e,t),executeQuery:(n,i)=>a(()=>i.type==="SELECT"?Sr(t,()=>it(n,t,i)):wr(t,()=>it(n,t,i))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.end()}}};var k=async(e,t,r)=>{try{let o;if(t==="mysql")o=await st(e);else if(t==="postgres")o=await ct(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 re=D(require("node:crypto"));var dt="aes-256-gcm",Er=12,mt=()=>{let e=T.str("SYMM_ENCRYPTION_KEY");if(!e)throw new Error("Missing ENCRYPTION_KEY in environment variables.");let t=Buffer.from(e,"hex");if(t.length!==32)throw new Error("ENCRYPTION_KEY must be a 64-character hex string (256 bits).");return t},br=e=>{let t=re.default.randomBytes(Er),r=mt(),o=re.default.createCipheriv(dt,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")}},Rr=({encrypted:e,iv:t,tag:r})=>{let o=mt(),a=re.default.createDecipheriv(dt,o,Buffer.from(t,"hex"));a.setAuthTag(Buffer.from(r,"hex"));let n=a.update(e,"hex","utf8");return n+=a.final("utf8"),n},oe={encrypt:br,decrypt:Rr};var q=(e,t=!1)=>{if(t){let r=oe.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 lt=[{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"}],Ir=lt.reduce((e,t)=>(e[t.value]=t.label,e),{}),sa=lt.reduce((e,t)=>(e[t.label]=t.value,e),{}),H=e=>e.map(t=>({label:Ir[t],value:t})),ia=H(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),ua=H(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),ca=H(["=","<>","IS NULL","IS NOT NULL"]),da=H(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),ma=H(["IS NULL","IS NOT NULL"]),la=H(["IN","NOT IN"]);var Re=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"],pa=new Set(Re);var fa=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var Ie=e=>e.fn?e.distinct===!0?`${e.fn} distinct ${e.value}`:`${e.fn} ${e.value}`:e.value;var Ce={read_only:10,editor:20,admin:30,owner:40};var b=e=>{let t=Ce[e];return r=>Ce[r.currentTeamRole]>=t},pt=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 ft=g(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=p(t),o=await E.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 E.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",config:{requireRole:b("admin")},handler:async t=>{let{teamId:r,ownerId:o,...a}=l(t,ot),n=E.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),i=await k(q(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:f,encrypted:c}=oe.encrypt(n.dbPassword);return n.dbPassword=c,n.dbPasswordIv=f,n.dbPasswordTag=u,{data:await E.save(n)}}}),e.route({method:"put",url:"/:id",config:{requireRole:b("admin")},handler:async t=>{let{id:r}=p(t),o=l(t),a=await E.findOneBy({id:r});if(!a)throw new s(404,"Data source not found");let n=E.merge(a,o);return await E.save(n),{data:n}}}),e.route({method:"delete",url:"/:id",config:{requireRole:b("admin")},handler:async(t,r)=>h.transaction(async()=>{let{id:o}=p(t);await Promise.all([v.delete({datasource:{id:o}}),I.delete({dataSource:{id:o}})]),await E.delete({id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=p(t),a=await E.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 E.save(a);let i=await(await k(q(a,!0),a.dbType,t)).inspectSchema();await v.delete({datasource:{id:o}}),await v.insert(i.sort().map(u=>v.create({tableName:u.tableName,columns:u.columns,datasource:{id:o}}))),a.status="READY",a.lastInspected=new Date,await E.save(a)}}),e.route({method:"get",url:"/:id/inspections",handler:async t=>{let{id:r}=p(t);return{data:await v.find({where:{datasource:{id:r}}})}}})});var B=require("typeorm"),yt=g(e=>{e.route({method:"get",url:"/team/:teamId/datasources",handler:async t=>{let{teamId:r}=p(t);return{data:await E.find({where:{team:{id:r}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0,dbType:!0,description:!0,allowInsert:!0,allowUpdate:!0}})}}}),e.route({method:"get",url:"/team/:teamId/queries",handler:async t=>{let o=p(t).teamId||t.user.currentTeamId;return{data:(await x.find({where:[{isPersonal:!1,team:{id:o}},{isPersonal:!0,team:{id:o},user:{id:t.user.id}}],relations:{query:!0},select:{id:!0,query:{id:!0,name:!0,updatedAt:!0}}})).map(i=>({name:i.query.name,id:i.query.id,updatedAt:i.query.updatedAt,savedQueryId:i.id}))}}}),e.route({method:"get",url:"/team/:teamId/query",handler:async t=>{let{teamId:r}=p(t),{search:o,size:a,selectedDataSources:n}=L(t),i=o.length>3?parseInt(a)||20:8,u={};n?.length&&(u.id=(0,B.In)(n));let[f,c,S]=await Promise.all([v.find({where:{tableName:(0,B.Raw)(d=>`LOWER(${d}) 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,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:i}),x.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:i})]),C=[];return f.forEach(d=>{C.push({name:d.tableName,id:d.id,dataSourceName:d.datasource?.name||"--",dataSourceId:d.datasource?.id||"--",type:"table"})}),c.forEach(d=>{C.push({name:d.name,id:d.id,dataSourceName:d.dataSource?.name||"--",dataSourceId:d.dataSource?.id||"--",type:"tab"})}),S.forEach(d=>{C.push({name:d.query.name,id:d.query.id,dataSourceName:d.query.dataSource?.name||"--",dataSourceId:d.query.dataSource?.id||"--",type:"query"})}),{data:C}}}),e.route({method:"get",url:"/team/:teamId/tabs-history",handler:async t=>{let{teamId:r}=p(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}},relations:{dataSource:!0},order:{updatedAt:"DESC"},take:n+1,skip:a*n}),f=!1;return u.length>n&&(u.pop(),f=!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:f}}})});var Tt=g(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=p(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:b("editor")},handler:async t=>{let r=l(t),o=await E.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:b("editor")},handler:async t=>{let{id:r}=p(t),o=l(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:b("editor")},handler:async t=>h.transaction(async()=>{let{id:r}=p(t);if(!(await I.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var ae=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`},G={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:ae,MAX:ae,MIN:ae,COUNT:ae};var ne=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`},K={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:ne,MAX:ne,MIN:ne,COUNT:ne};var ht=["SUM","COUNT","AVG","MAX","MIN"],Cr=["YEAR","MONTH","DAY",...ht],Nr=Cr.reduce((e,t)=>(e[t]=!0,e),{}),Ar=ht.reduce((e,t)=>(e[t]=!0,e),{}),se=e=>Nr[e],gt=e=>Ar[e],wt=(e,t)=>e.fn&&se(e.fn)?(t==="postgres"?G:K)[e.fn](e):e.value;var ie=e=>typeof e=="string",St=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},V=(e,t)=>{let{column:r,operator:o,value:a,fn:n}=e,i=wt({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(d=>ie(d.value)?`'${d.value}'`:d.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 S=a?.[0],C;return ie(S?.value)&&S?.isColumn!==!0?C=`'${S?.value}'`:C=S?.value,`${i} ${o} ${C}`}};var ue=class{constructor(t="mysql"){this.dialect=t,this.skeleton={type:"SELECT"}}addWhere(t){let r=V(t,this.dialect);if(t.isEnabled!==!1)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=V(t,this.dialect);if(t.isEnabled!==!1)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 St(this.skeleton)}};var bt=require("typeorm");var ce=async(e,t)=>{let{datasourceId:r,size:o=20,page:a,name:n}=t,{table:i,filters:u,joins:f,groupBy:c,searchAll:S,orderBy:C}=t.opts,d=Ur(t.opts.columns,t.opts.groupBy,t.opts.aggregations),w=await E.findOne({where:{id:r},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]}),F=[i],Y=[];if(!w)throw new s(404,"Data source not found");let Gt=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 ue(w.dbType);P.setTable(i),P.setLimit(o+1),P.setOffset(o*a),u?.forEach(m=>{m.fn&&gt(m.fn)?P.addHaving(m):P.addWhere(m)}),f&&(P.addJoin(...f),f.forEach(m=>{F.push(m.table)}));let Pe=Dr(d,C,w.dbType);Pe.length>0&&P.addOrderBy(...Pe),c&&c.length>0&&c.forEach(m=>P.addGroupBy(_r(m,w.dbType)));let Kt=await v.find({where:{tableName:(0,bt.In)(F),datasource:{id:r}}});for(let m of Kt)if(m.columns)for(let _ of m.columns)Y.push({column:_.name,table:m.tableName||"",full:`${m.tableName}.${_.name}`,type:_.type});let Vt=Y.reduce((m,_)=>(m[_.full]=_.type,m),{}),J;if(d&&d.length>0?J=d.map(m=>Pr(m,w.dbType)):J=Y.map(m=>`${m.full} as "${m.full}"`),P.selectColumns(J),S){let m=Y.filter(_=>Re.includes(_.type)&&J.some(de=>de.startsWith(_.full)));if(m.length>0){let _=m.map(de=>`LOWER(${de.full}) LIKE '%${S.toLowerCase()}%'`);P.addWhereRaw(`(${_.join(" OR ")})`,"AND")}}let X=await(await k(q(w,!0),w.dbType,e)).executeQuery(P.toSQL(),{type:"SELECT",allowBulkUpdate:!1}),_e=X.rows.length>o;return _e&&X.rows.pop(),{...X,queryHistoryId:Gt.id,tables:F,allColumns:Y,columns:X.columns.map(m=>({...m,type:Vt[m.full]})),hasMore:_e}},Rt=async(e,t)=>{let r=await E.findOne({where:{id:t.datasourceId},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowUpdate"]});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:f})=>typeof u=="string"?u&&u.startsWith("=")?`${f}=${u.substring(1)}`:`${f}='${u}'`:`${f}='${u}'`).join(", "),a=t.filters.map(u=>V(u,r.dbType)).join(" AND "),n=`UPDATE ${t.table} SET ${o} WHERE ${a}`;return(await k(q(r,!0),r.dbType,e)).executeQuery(n,{type:"UPDATE",allowBulkUpdate:!1})},It=async(e,t)=>{let r=await E.findOne({where:{id:t.datasourceId},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowInsert"]});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}=Or(t.values),n=`INSERT INTO ${t.table} (${o}) VALUES (${a})`;return(await k(q(r,!0),r.dbType,e)).executeQuery(n,{type:"INSERT",allowBulkUpdate:!1})},Or=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}},Pr=(e,t)=>{if(e.fn){if(se(e.fn))return`${(t==="postgres"?G:K)[e.fn](e)} as "${Ie(e)}"`;throw new Error("Function not allowed: "+e.fn)}return`${e.value} as "${e.value}"`},_r=(e,t)=>{if(e.fn){if(se(e.fn))return(t==="postgres"?G:K)[e.fn]({...e,value:Et(e.value,t)});throw new Error("Function not allowed: "+e.fn)}return Et(e.value,t)},Ne=(e,t)=>t==="postgres"?`"${e}"`:t==="mysql"?`\`${e}\``:e,Et=(e,t)=>{let[r,o]=e.split(".");return Ne(r,t)+"."+Ne(o,t)},Dr=(e,t,r)=>{if(e&&e.length>0){let o=e.reduce((a,n)=>(a.set(Ie(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:Ne(a.column,r)}:a)}return t},Ur=(e,t,r)=>{let o=[];return t.length>0||r.length>0?o.push(...t,...r):e.length>0&&o.push(...e),o};var Ct=e=>{},vr=["--",";","DROP","drop"],Nt=e=>{if(ie(e.value)&&e.value.startsWith("=")){let t=e.value;vr.forEach(r=>{if(t.includes(r))throw new s(400,"Invalid input value for "+e.column)})}},At=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(Nt)},Ot=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(Nt)};var Pt=g(e=>{e.route({method:"post",url:"/select",handler:async t=>{let r=l(t,Ct);return{data:await ce(t,r)}}}),e.route({method:"post",url:"/insert",config:{requireRole:b("editor")},handler:async t=>{let r=l(t,At);return{data:await It(t,r)}}}),e.route({method:"post",url:"/update",config:{requireRole:b("editor")},handler:async t=>{let r=l(t,Ot);return{data:await Rt(t,r)}}})});var _t=g(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:T.str("SERVER_VERSION")}}))});var Dt=g(e=>{e.route({method:"get",url:"/:id/users",handler:async t=>{let{id:r}=p(t),o=await M.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:b("editor")},handler:async t=>h.transaction(async()=>{let r=t.user.id,o=l(t),a=R.create();a.id=r;let n=M.create(o);await M.save(n);let i=N.create({user:a,team:n});return await N.save(i),{data:n}})}),e.route({method:"patch",url:"/:id/user-role",config:{requireRole:b("admin")},handler:async t=>{let{id:r}=p(t),{role:o,userId:a}=l(t,({role:i})=>{if(i==="owner")throw new s(400,"Only one owner is allowed")});if((await N.findOneBy({user:{id:a},team:{id:r}}))?.role==="owner")throw new s(400,"Cannot change owner role");await N.update({user:{id:a},team:{id:r}},{role:o})}}),e.route({method:"delete",url:"/:id",config:{requireRole:b("admin")},handler:async t=>h.transaction(async()=>{let{id:r}=p(t),{userId:o}=L(t);if((await N.findOneBy({user:{id:o},team:{id:r}}))?.role==="owner")throw new s(400,"Cannot delete team owner");await R.update(o,{currentTeam:null}),await N.delete({user:{id:o},team:{id:r}}),await R.delete({id:o})})})});var Ae=D(require("bcryptjs")),z=async e=>{let t=await Ae.default.genSalt(10);return Ae.default.hash(e,t)};var Ut=g(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=await R.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=l(t);if(o.password&&(o.password=await z(o.password)),!(await R.update(r,o)).affected)throw new s(404,"User not found");let n=await R.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:b("admin")},handler:async t=>h.transaction(async()=>{let r=l(t),o=await z(r.password),a=await R.save(R.create({username:r.username,password:o})),n=await N.save(N.create({role:"read_only",team:{id:r.teamId},user:{id:a.id}}));await R.update(a.id,{currentTeam:{id:n.id}})})})});var vt=g(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}=l(t);if(!r.id)throw new s(400,"Settings id is required!");if(!(await $.update(r.id,r)).affected)throw new s(404,"You do not own these settings!");return{data:await $.findOneBy({id:r.id})}}})});function W(e,...t){let r=[...t];if(e.searchAll&&r.push(e.searchAll),e.filters){for(let o of e.filters)if(o.value)for(let a of o.value)a.value&&r.push(a.value.toString())}return r.map(o=>o.toLowerCase()).join(",")}var xt=g(e=>{e.route({method:"post",url:"/",config:{requireRole:b("editor")},handler:async t=>{let r=l(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:W(o.opts,r.name)}));return await I.update(r.queryId,{name:r.name}),{data:a}}}),e.route({method:"delete",url:"/:id",config:{requireRole:b("editor")},handler:async t=>{let{id:r}=p(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 h.transaction(async()=>{let{id:r}=p(t),o=l(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=W(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 Mt=e=>{if(!e.queryId&&!(e.opts&&e.name))throw new s(400,"Either queryId or name and opts are required")};var Lt=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}=p(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}=l(t,Mt),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}=p(t),o=l(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:W(o,a.name),updatedAt:new Date}),{data:{result:await ce(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}=p(t),o=l(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=W(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}=p(t),o=t.user.id;return await A.delete({id:r,user:{id:o}}),{data:!0}}})});var Wt=require("node:path");var xr=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),kt=async e=>{if(xr(e))return;let t=e.headers.authorization;if(!t)throw new s(401,"Missing auth token");let[r,o]=t.split(" ");try{let{userId:a}=await Xe(o),n=await R.findOne({where:{id:a},select:{id:!0,currentTeam:{role:!0,team:{id:!0}}},relations:{currentTeam:{team:!0}}});if(!n)throw new s(401,"User is not part of a team");e.user={id:a,currentTeamId:n.currentTeam.team.id,currentTeamRole:n.currentTeam.role}}catch{throw new s(401,"Unauthorized")}};var qt=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Yt=D(require("@fastify/cookie"));var Oe={teamName:"Default Team",username:"admin",password:"admin"},Mr=async()=>{let e=await M.findOneBy({});return e||M.save(M.create({name:Oe.teamName}))},Qt=async()=>{let e=await N.findOne({where:{role:"owner"},relations:{user:!0}});if(e)return e.user;let t=await Mr(),r=await z(Oe.password),o=await R.save(R.create({username:Oe.username,password:r})),a=await N.save(N.create({user:o,team:t,role:"owner"}));return await R.update(o.id,{currentTeam:a}),o};var O=(0,Bt.default)({querystringParser:e=>Ht.default.parse(e)}),jt=T.num("PORT",4466),Lr=T.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),kr="0.0.0.0",qr=[`http://localhost:${jt}`,...Lr];function U(e,t){O.register(e,{prefix:t}),console.log("Registered "+t)}(async function(){xe(),await O.register(Yt.default,{}),await O.register(Ft.default,{origin:(t,r)=>{!t||qr.includes(t)?r(null,!0):r(new Error("Not allowed by CORS"),!1)},methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),await O.register($t.default,{root:(0,Wt.join)(__dirname,"web")}),O.get("/",(t,r)=>{r.sendFile("index.html")}),O.addHook("onRequest",kt),O.addHook("onRequest",pt),O.addHook("onResponse",qt),U(rt,"/api/auth"),U(ft,"/api/data-sources"),U(yt,"/api/project"),U(Tt,"/api/queries"),U(Pt,"/api/runner"),U(_t,"/api/status"),U(Dt,"/api/teams"),U(Ut,"/api/users"),U(vt,"/api/user-settings"),U(xt,"/api/saved-queries"),U(Lt,"/api/workbench-tabs"),O.setNotFoundHandler((t,r)=>{if(t.raw.url?.startsWith("/api/")){r.code(404).send({error:"API route not found"});return}r.sendFile("index.html")}),O.setErrorHandler((t,r,o)=>{if(console.error(t),t instanceof s){o.status(t.status).send({error:t.message});return}else o.status(500).send({error:"Internal Server Error"})}),await O.after(),await Ge(),await Qt(),O.listen({port:jt,host:kr},(t,r)=>{t&&(console.error(t),process.exit(1)),console.log(`Server listening at ${r}`)})})();