@dataramen/cli 0.0.36 → 0.0.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/code/server.js +7 -7
- package/dist/code/web/assets/index-C1qgifM6.css +1 -0
- package/dist/code/web/assets/index-DaLVnV7F.js +310 -0
- package/dist/code/web/index.html +2 -4
- package/dist/package.json +1 -1
- package/package.json +1 -1
- package/dist/code/web/assets/index-CUrYEtTM.css +0 -1
- package/dist/code/web/assets/index-q7IHTLYU.js +0 -310
package/dist/code/server.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var Lt=Object.create;var ge=Object.defineProperty;var qt=Object.getOwnPropertyDescriptor;var Ft=Object.getOwnPropertyNames;var Qt=Object.getPrototypeOf,kt=Object.prototype.hasOwnProperty;var Bt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of Ft(t))!kt.call(e,a)&&a!==r&&ge(e,a,{get:()=>t[a],enumerable:!(o=qt(t,a))||o.enumerable});return e};var A=(e,t,r)=>(r=e!=null?Lt(Qt(e)):{},Bt(t||!e||!e.__esModule?ge(r,"default",{value:e,enumerable:!0}):r,e));var K=require("dotenv"),G=require("node:path"),we=require("node:fs"),$t=(()=>{try{let e=(0,we.readFileSync)((0,G.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})();(0,K.config)({path:[(0,G.join)(__dirname,"..","env",".env"),(0,G.join)(__dirname,"..","env",".env.default")]});(0,K.populate)(process.env,{SERVER_VERSION:$t.version});var Ht=["SYMM_ENCRYPTION_KEY","JWT_SECRET","JWT_REFRESH_SECRET"],Ee=()=>{let e=[];for(let t of Ht)process.env[t]||e.push(t);if(e.length>0)throw new Error("Following env variables are required but not provided: "+e.join(", "))};function Yt(e,t=void 0){return process.env[e]||t}function Wt(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 Gt(e){return process.env[e]==="true"||process.env[e]==="TRUE"}var m={str:Yt,num:Wt,bool:Gt};var ns=require("reflect-metadata"),_t=A(require("fastify")),Pt=A(require("@fastify/cors")),Dt=A(require("@fastify/static"));var s=class extends Error{constructor(r,o){super(o);this.status=r;this.message=o}};var Ae=require("typeorm");var Re=require("typeorm");var T=m.str("APP_DB_TYPE")==="sqlite"?"datetime":"timestamp";var oe=new Re.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:T,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:T,default:()=>"CURRENT_TIMESTAMP"}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var Se=require("typeorm");var ae=new Se.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:T,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:T,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 be=require("typeorm");var ne=new be.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:T,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:T,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}}});var Ne=require("typeorm");var se=new Ne.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:T,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:T,default:()=>"CURRENT_TIMESTAMP"}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var Ce=require("typeorm");var ie=new Ce.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:T,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:T,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:T,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 _e=A(require("node:os")),Pe=require("node:path");var Ie=require("typeorm");var ue=new Ie.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",default:"{}"},isTrash:{type:Boolean,default:!1,nullable:!0},createdAt:{type:T,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:T,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}}});var Oe=require("typeorm"),ce=new Oe.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"}}});function Kt(){let e=m.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>",_e.default.homedir())),e}var E=new Ae.DataSource({type:m.str("APP_DB_TYPE"),database:Kt(),host:m.str("APP_DB_HOST"),username:m.str("APP_DB_USERNAME"),password:m.str("APP_DB_PASSWORD"),port:m.num("APP_DB_PORT"),schema:m.str("APP_DB_SCHEMA"),logging:m.bool("APP_DB_LOGGING"),migrationsRun:!0,migrations:[Pe.posix.join(__dirname,"migrations","*.js")],entities:[oe,ie,ae,ne,ce,se,ue]}),De=async()=>{if(!E.isInitialized)return E.initialize();throw new Error("Already initialized")},P=E.getRepository(oe),f=E.getRepository(ie),x=E.getRepository(ae),S=E.getRepository(ne),N=E.getRepository(ce),q=E.getRepository(se),O=E.getRepository(ue);var me=A(require("node:fs/promises")),Ue=require("node:path"),xe=A(require("node:os")),jt=xe.default.homedir(),ve=(0,Ue.join)(jt,".dataramen",".runtime","files"),Me=async()=>{await Vt()||await me.default.mkdir(ve,{recursive:!0})};async function Vt(){try{return(await me.default.lstat(ve)).isDirectory()}catch{return!1}}var R=e=>(t,r,o)=>{e(t),o()};var k=require("jose");var Le=new TextEncoder,qe=Le.encode(m.str("JWT_SECRET")),Fe=Le.encode(m.str("JWT_REFRESH_SECRET")),le=async({userId:e})=>new k.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign(qe),de=async({userId:e})=>new k.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign(Fe),Qe=async(e,t)=>{try{let{payload:r}=await(0,k.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")}},ke=async e=>Qe(e,qe),Be=async e=>Qe(e,Fe);var y=(e,t)=>{let r=e.body;return t&&t(r),r},v=(e,t)=>{let r=e.query;return t&&t(r),r},b=(e,t)=>{let r=e.params;return t&&t(r),r};var He=A(require("bcryptjs"));var $e=e=>{if(!e?.username)throw new s(400,"Username is required");if(!e?.password)throw new s(400,"Password is required")};var j="DATARAMEN_refresh_token",pe={httpOnly:!0,secure:m.bool("PROD"),sameSite:m.bool("PROD"),path:"/",maxAge:10*24*60*60},Ye=R(e=>{e.route({method:"post",url:"/login",config:{isPublic:!0},handler:async(t,r)=>{let{username:o,password:a}=y(t,$e),n=await S.findOne({where:{username:o}});if(!n||!He.default.compareSync(a,n.password))throw new s(401,"Invalid credentials");let[i,u]=await Promise.all([le({userId:n?.id}),de({userId:n?.id})]);return r.setCookie(j,u,pe),{data:{accessToken:i}}}}),e.route({method:"post",url:"/refresh",config:{isPublic:!0},handler:async(t,r)=>{let o=t.cookies[j];if(!o)return r.code(401).send({message:"Missing refresh token"});let{userId:a}=await Be(o),[n,i]=await Promise.all([le({userId:a}),de({userId:a})]);return r.setCookie(j,i,pe),{data:{accessToken:n}}}}),e.route({method:"post",url:"/logout",config:{isPublic:!0},handler:async(t,r)=>(r.clearCookie(j,pe),{data:!0})})});var We=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 Ke=A(require("mysql2/promise"));var Jt=({database:e,password:t,user:r,url:o})=>Ke.default.createConnection({host:o,user:r,database:e,password:t}),zt=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),o={};return r.forEach(a=>{let n=a.TABLE_NAME,i=a.COLUMN_NAME;o[n]||(o[n]=[]),o[n].push(i)}),o},
|
|
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},Xt=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),o={};return Array.isArray(r)&&r.forEach(a=>{o[a.table_name]||(o[a.table_name]={}),o[a.table_name][a.field]={refTable:a.referenced_table,refField:a.referenced_field}}),o},
|
|
17
|
+
`,[r]=await e.execute(t),o={};return Array.isArray(r)&&r.forEach(a=>{o[a.table_name]||(o[a.table_name]={}),o[a.table_name][a.field]={refTable:a.referenced_table,refField:a.referenced_field}}),o},Zt=async(e,t)=>{let o=(await t.query("SHOW TABLES"))[0],a=await Xt(t),n=await zt(t),i=o.map(async u=>{let l=Object.values(u)[0],c=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${e.database}' and table_name = '${l}'`,[h]=await t.query(c),g=a[l];return{columns:h.map(p=>({name:p.COLUMN_NAME,type:p.DATA_TYPE,isPrimary:n[l]?.includes(p.COLUMN_NAME),ref:g?.[p.COLUMN_NAME]?{table:g[p.COLUMN_NAME].refTable,field:g[p.COLUMN_NAME].refField}:void 0})).sort((p,w)=>p.isPrimary&&w.isPrimary?p.name.localeCompare(w.name):p.isPrimary?-1:1),createdAt:new Date,tableName:l,updatedAt:new Date}});return Promise.all(i)},Ge=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)}},er=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}},tr=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}},je=async e=>{let t=await Jt(e),r=!1;return{dbType:"mysql",dataSource:e,inspectSchema:()=>Zt(e,t),executeQuery:(o,a)=>a.type==="SELECT"?tr(t,()=>Ge(o,t,a)):er(t,()=>Ge(o,t,a)),checkConnection:async()=>t.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.destroy()}}};var Je=A(require("pg"));var rr=async({database:e,password:t,user:r,url:o,port:a})=>{let n=new Je.default.Client({host:o,user:r,database:e,password:t,port:a,query_timeout:1e4});return await n.connect(),n},or=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
|
-
`),o={};return r.rows.forEach(a=>{let n=a.table_name,i=a.column_name;o[n]||(o[n]=[]),o[n].push(i)}),o},
|
|
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},ar=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
|
-
`),o={};return r.rows.forEach(a=>{o[a.table_name]||(o[a.table_name]={}),o[a.table_name][a.field]={refTable:a.referenced_table,refField:a.referenced_field}}),o},
|
|
46
|
+
`),o={};return r.rows.forEach(a=>{o[a.table_name]||(o[a.table_name]={}),o[a.table_name][a.field]={refTable:a.referenced_table,refField:a.referenced_field}}),o},nr=async(e,t)=>{let r=`SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = '${e.schema}'`,a=(await t.query(r)).rows,n=await ar(t),i=await or(t),u=a.map(async l=>{let c=Object.values(l)[0],h=`
|
|
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:g}=await t.query(h),p=n[c];return{columns:g.map(w=>({name:w.column_name,type:w.data_type,isPrimary:i[c]?.includes(w.column_name),ref:p?.[w.column_name]?{table:p[w.column_name].refTable,field:p[w.column_name].refField}:void 0})).sort((w,
|
|
52
|
+
`,{rows:g}=await t.query(h),p=n[c];return{columns:g.map(w=>({name:w.column_name,type:w.data_type,isPrimary:i[c]?.includes(w.column_name),ref:p?.[w.column_name]?{table:p[w.column_name].refTable,field:p[w.column_name].refField}:void 0})).sort((w,I)=>w.isPrimary&&I.isPrimary?w.name.localeCompare(I.name):w.isPrimary?-1:1),createdAt:new Date,tableName:c,updatedAt:new Date}});return Promise.all(u)},sr=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((a,n)=>(a[n.row_key]={table:n.relname,column:n.attname},a),{})},We=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}'`),l=await ar(u,t);return{columns:a.map(c=>{let h=l[`${c.tableID}-${c.columnID}`];return{column:h?.column||c.name,alias:c.name,table:h?.table||"",full:h?h.table+"."+h.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)}},nr=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}},ze=async e=>{let t=await er(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:()=>or(e,t),executeQuery:(n,i)=>a(()=>i.type==="SELECT"?sr(t,()=>We(n,t,i)):nr(t,()=>We(n,t,i))),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 je(e);else if(t==="postgres")o=await ze(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 W=A(require("node:crypto"));var Je="aes-256-gcm",ir=12,Xe=()=>{let e=m.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},ur=e=>{let t=W.default.randomBytes(ir),r=Xe(),o=W.default.createCipheriv(Je,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")}},cr=({encrypted:e,iv:t,tag:r})=>{let o=Xe(),a=W.default.createDecipheriv(Je,o,Buffer.from(t,"hex"));a.setAuthTag(Buffer.from(r,"hex"));let n=a.update(e,"hex","utf8");return n+=a.final("utf8"),n},V={encrypt:ur,decrypt:cr};var v=(e,t=!1)=>{if(t){let r=V.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 C=(...e)=>(t,r,o)=>{if(!e.includes(t.user.currentTeamRole))throw new s(403,"You are not authorized to perform this action");o()};var Ze=E(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=I(t),o=await f.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}=F(t);return{data:await f.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",preHandler:[C("admin")],handler:async t=>{let{teamId:r,ownerId:o,...a}=T(t,Ye),n=f.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),i=await M(v(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:l,encrypted:c}=V.encrypt(n.dbPassword);return n.dbPassword=c,n.dbPasswordIv=l,n.dbPasswordTag=u,{data:await f.save(n)}}}),e.route({method:"put",url:"/:id",preHandler:[C("admin")],handler:async t=>{let{id:r}=I(t),o=T(t),a=await f.findOneBy({id:r});if(!a)throw new s(404,"Data source not found");let n=f.merge(a,o);return await f.save(n),{data:n}}}),e.route({method:"delete",url:"/:id",preHandler:[C("admin")],handler:async(t,r)=>R.transaction(async()=>{let{id:o}=I(t);await Promise.all([_.delete({datasource:{id:o}}),N.delete({dataSource:{id:o}})]),await f.delete({id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=I(t),a=await f.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 f.save(a);let i=await(await M(v(a,!0),a.dbType,t)).inspectSchema();await _.delete({datasource:{id:o}}),await _.insert(i.sort().map(u=>_.create({tableName:u.tableName,columns:u.columns,datasource:{id:o}}))),a.status="READY",a.lastInspected=new Date,await f.save(a)}}),e.route({method:"get",url:"/:id/inspections",handler:async(t,r)=>{let{id:o}=I(t);return{data:await _.find({where:{datasource:{id:o}}})}}})});var ye=require("typeorm"),et=E(e=>{e.route({method:"get",url:"/team/:teamId/files",handler:async(t,r)=>{let{teamId:o}=I(t),a={where:{team:{id:o}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0}},[n=[],i=[]]=await Promise.all([f.find(a),N.find({...a,where:{...a.where,isTrash:!1}})]);return{data:[...n.map(u=>({...u,type:"dataSource"})),...i.map(u=>({...u,type:"query"}))]}}}),e.route({method:"get",url:"/team/:teamId/query",handler:async t=>{let{teamId:r}=I(t),{search:o,size:a}=F(t),n=(parseInt(a)||20)/2,[i,u]=await Promise.all([_.find({where:{tableName:(0,ye.Like)(`%${o}%`),datasource:{team:{id:r}}},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:n}),N.find({where:{name:(0,ye.Like)(`%${o}%`),isTrash:!1,dataSource:{team:{id:r}}},relations:{dataSource:!0},select:{id:!0,name:!0,dataSource:{name:!0,id:!0}},order:{name:"ASC"},take:n})]),l=[];return i.forEach(c=>{l.push({name:c.tableName,id:c.id,dataSourceName:c.datasource?.name||"--",dataSourceId:c.datasource?.id||"--",type:"table"})}),u.forEach(c=>{l.push({name:c.name,id:c.id,dataSourceName:c.dataSource?.name||"--",dataSourceId:c.dataSource?.id||"--",type:"query"})}),{data:l}}})});function tt(e,t=void 0){try{if(e){let r=e.split("&"),o={};for(let a of r){let n=a.split(":");o[n[0]]=n[1]}return o}}catch{}return t}var rt=require("typeorm");var ot=E(e=>{e.route({method:"get",url:"/",handler:async t=>{let{dataSourceId:r,teamId:o,limit:a,orderBy:n,name:i}=F(t);if(!r&&!o)throw new s(400,"Either dsId or teamId is required");let u={isTrash:!1};return r&&(u.dataSource={id:r}),o&&(u.team={id:o}),i&&(u.name=(0,rt.Like)(`%${i}%`)),{data:await N.find({where:u,take:a,order:tt(n,{createdAt:"DESC"})})}}}),e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=I(t),o=await N.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:"/",preHandler:[C("admin","editor")],handler:async t=>{let r=T(t),o=await f.findOne({where:{id:r.dataSourceId},relations:{team:!0}}),a=await N.save(N.create({name:r.name,isTrash:!1,opts:r.opts,team:{id:o?.team.id},dataSource:{id:r.dataSourceId}}));return console.log("Created query!"),{data:a}}}),e.route({method:"patch",url:"/:id",preHandler:[C("admin","editor")],handler:async t=>{let{id:r}=I(t),o=T(t);if(!(await N.update(r,o)).affected)throw new s(404,"Query not found");return{data:await N.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",preHandler:[C("admin","editor")],handler:async t=>R.transaction(async()=>{let{id:r}=I(t);if(!(await N.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var J=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`},k={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:J,MAX:J,MIN:J,COUNT:J};var X=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`},B={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:X,MAX:X,MIN:X,COUNT:X};var at=["SUM","COUNT","AVG","MAX","MIN"],mr=["YEAR","MONTH","DAY",...at],lr=mr.reduce((e,t)=>(e[t]=!0,e),{}),dr=at.reduce((e,t)=>(e[t]=!0,e),{}),Z=e=>lr[e],nt=e=>dr[e],st=(e,t)=>e.fn&&Z(e.fn)?(t==="postgres"?k:B)[e.fn](e):e.value;var ee=e=>typeof e=="string",it=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},$=(e,t)=>{let{column:r,operator:o,value:a,fn:n}=e,i=st({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(p=>ee(p.value)?`'${p.value}'`:p.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":"LIKE"} '%${a?.[0].value}%'`;default:let h=a?.[0],g;return ee(h?.value)&&h?.isColumn!==!0?g=`'${h?.value}'`:g=h?.value,`${i} ${o} ${g}`}};var te=class{constructor(t="mysql"){this.dialect=t,this.skeleton={type:"SELECT"}}addWhere(t){let r=$(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=$(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 it(this.skeleton)}};var lt=require("typeorm");var ut=[{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"}],pr=ut.reduce((e,t)=>(e[t.value]=t.label,e),{}),Ua=ut.reduce((e,t)=>(e[t.label]=t.value,e),{}),Q=e=>e.map(t=>({label:pr[t],value:t})),xa=Q(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),Ma=Q(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),va=Q(["=","<>","IS NULL","IS NOT NULL"]),La=Q(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),Fa=Q(["IS NULL","IS NOT NULL"]),Qa=Q(["IN","NOT IN"]);var ct=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"];var qa=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var mt=e=>e.fn?e.distinct===!0?`${e.fn} distinct ${e.value}`:`${e.fn} ${e.value}`:e.value;var dt=async(e,{table:t,datasourceId:r,filters:o,joins:a,orderBy:n,size:i,page:u,columns:l,groupBy:c,searchAll:h})=>{let g=await f.findOne({where:{id:r},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]}),p=[t],w=[];if(!g)throw new s(404,"Data source not found");let b=new te(g.dbType);b.setTable(t),b.setLimit(i||20),b.setOffset(i*u),o?.forEach(d=>{d.fn&&nt(d.fn)?b.addHaving(d):b.addWhere(d)}),a&&(b.addJoin(...a),a.forEach(d=>{p.push(d.table)})),n&&b.addOrderBy(...n.map(d=>({...d,column:hr(d.column,g.dbType)}))),c&&c.length>0&&c.forEach(d=>b.addGroupBy(Tr(d,g.dbType)));let xt=await _.find({where:{tableName:(0,lt.In)(p),datasource:{id:r}}});for(let d of xt)if(d.columns)for(let U of d.columns)w.push({column:U.name,table:d.tableName||"",full:`${d.tableName}.${U.name}`,type:U.type});let Y;if(l&&l.length>0?Y=l.map(d=>yr(d,g.dbType)):Y=w.map(d=>`${d.full} as "${d.full}"`),b.selectColumns(Y),h){let d=w.filter(U=>ct.includes(U.type)&&Y.some(oe=>oe.startsWith(U.full)));if(d.length>0){let U=d.map(oe=>`LOWER(${oe.full}) LIKE '%${h.toLowerCase()}%'`);b.addWhereRaw(`(${U.join(" OR ")})`,"AND")}}return{...await(await M(v(g,!0),g.dbType,e)).executeQuery(b.toSQL(),{type:"SELECT",allowBulkUpdate:!1}),tables:p,allColumns:w}},pt=async(e,t)=>{let r=await f.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:l})=>typeof u=="string"?u&&u.startsWith("=")?`${l}=${u.substring(1)}`:`${l}='${u}'`:`${l}='${u}'`).join(", "),a=t.filters.map(u=>$(u,r.dbType)).join(" AND "),n=`UPDATE ${t.table} SET ${o} WHERE ${a}`;return(await M(v(r,!0),r.dbType,e)).executeQuery(n,{type:"UPDATE",allowBulkUpdate:!1})},ft=async(e,t)=>{let r=await f.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}=fr(t.values),n=`INSERT INTO ${t.table} (${o}) VALUES (${a})`;return(await M(v(r,!0),r.dbType,e)).executeQuery(n,{type:"INSERT",allowBulkUpdate:!1})},fr=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}},yr=(e,t)=>{if(e.fn){if(Z(e.fn))return`${(t==="postgres"?k:B)[e.fn](e)} as "${mt(e)}"`;throw new Error("Function not allowed: "+e.fn)}return`${e.value} as "${e.value}"`},Tr=(e,t)=>{if(e.fn){if(Z(e.fn))return(t==="postgres"?k:B)[e.fn](e);throw new Error("Function not allowed: "+e.fn)}return e.value},hr=(e,t)=>t==="postgres"?`"${e}"`:t==="mysql"?`\`${e}\``:e;var yt=e=>{if(!e.table)throw new s(400,"Table is required")},gr=["--",";","DROP","drop"],Tt=e=>{if(ee(e.value)&&e.value.startsWith("=")){let t=e.value;gr.forEach(r=>{if(t.includes(r))throw new s(400,"Invalid input value for "+e.column)})}},ht=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(Tt)},gt=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(Tt)};var wt=E(e=>{e.route({method:"post",url:"/select",handler:async t=>{let r=T(t,yt);return{data:await dt(t,r)}}}),e.route({method:"post",url:"/insert",preHandler:[C("admin","editor")],handler:async t=>{let r=T(t,ht);return{data:await ft(t,r)}}}),e.route({method:"post",url:"/update",preHandler:[C("admin","editor")],handler:async t=>{let r=T(t,gt);return{data:await pt(t,r)}}})});var Et=E(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:m.str("SERVER_VERSION")}}))});var St=E(e=>{e.route({method:"get",url:"/",handler:async(t,r)=>{let o=t.user.id;return{data:await x.find({where:{users:{user:{id:o}}}})}}}),e.route({method:"post",url:"/",preHandler:[C("admin","editor")],handler:async t=>R.transaction(async()=>{let r=t.user.id,o=T(t),a=S.create();a.id=r;let n=x.create(o);await x.save(n);let i=P.create({user:a,team:n});return await P.save(i),{data:n}})})});var Te=A(require("bcryptjs")),re=async e=>{let t=await Te.default.genSalt(10);return Te.default.hash(e,t)};var Rt=E(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=T(t);if(o.password&&(o.password=await re(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:"put",url:"/team",handler:async t=>{let r=t.user.id,o=T(t),a=await P.findOneBy({user:{id:r},team:{id:o.teamId}});if(!a)throw new s(404,"User - Team association not found");await S.update(r,{currentTeam:a});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}}}})});var bt=E(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=t.user.id,o=await L.findOneBy({user:{id:r}});return o||(o=await L.save(L.create({user:{id:r}}))),{data:o}}}),e.route({method:"patch",url:"/",handler:async t=>{let{settings:r}=T(t);if(!r.id)throw new s(400,"Settings id is required!");if(!(await L.update(r.id,r)).affected)throw new s(404,"You do not own these settings!");return{data:await L.findOneBy({id:r.id})}}})});var Pt=require("node:path");var wr=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),Nt=async e=>{if(wr(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 qe(o),n=await P.findOneBy({user:{id:a}});if(!n)throw new s(401,"User is not part of a team");e.user={id:a,currentTeamRole:n.role}}catch{throw new s(401,"Unauthorized")}};var It=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Dt=A(require("@fastify/cookie"));var H={teamName:"Default Team",username:"admin",password:"admin"},Ct=async()=>{let e=await S.findOne({where:{username:H.username}});if(e)return e;let t=await x.save(x.create({name:H.teamName})),r=await re(H.password),o=await S.save(S.create({username:H.username,password:r})),a=await P.save(P.create({user:o,team:t,role:"admin"}));return await S.update(o.id,{currentTeam:a}),S.findOne({where:{username:H.username}})};var O=(0,At.default)(),Ut=m.num("PORT",4466),Er=m.bool("HOST")?"0.0.0.0":"127.0.0.1",Sr=m.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),Rr=["https://app.dataramen.xyz","https://dataramen.xyz",`http://localhost:${Ut}`,...Sr];function D(e,t){O.register(e,{prefix:t}),console.log("Registered "+t)}(async function(){we(),await Me(),await O.register(Dt.default,{}),await O.register(Ot.default,{origin:(t,r)=>{!t||Rr.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,Pt.join)(__dirname,"web")}),O.get("/",(t,r)=>{r.sendFile("index.html")}),O.addHook("onRequest",Nt),O.addHook("onResponse",It),D(He,"/api/auth"),D(Ze,"/api/data-sources"),D(et,"/api/project"),D(ot,"/api/queries"),D(wt,"/api/runner"),D(Et,"/api/status"),D(St,"/api/teams"),D(Rt,"/api/users"),D(bt,"/api/user-settings"),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 Pe(),await Ct(),O.listen({port:Ut,host:Er},(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),{})},Ve=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}'`),l=await sr(u,t);return{columns:a.map(c=>{let h=l[`${c.tableID}-${c.columnID}`];return{column:h?.column||c.name,alias:c.name,table:h?.table||"",full:h?h.table+"."+h.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)}},ir=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}},ur=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}},ze=async e=>{let t=await rr(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:()=>nr(e,t),executeQuery:(n,i)=>a(()=>i.type==="SELECT"?ur(t,()=>Ve(n,t,i)):ir(t,()=>Ve(n,t,i))),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 je(e);else if(t==="postgres")o=await ze(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 V=A(require("node:crypto"));var Xe="aes-256-gcm",cr=12,Ze=()=>{let e=m.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},mr=e=>{let t=V.default.randomBytes(cr),r=Ze(),o=V.default.createCipheriv(Xe,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")}},lr=({encrypted:e,iv:t,tag:r})=>{let o=Ze(),a=V.default.createDecipheriv(Xe,o,Buffer.from(t,"hex"));a.setAuthTag(Buffer.from(r,"hex"));let n=a.update(e,"hex","utf8");return n+=a.final("utf8"),n},J={encrypt:mr,decrypt:lr};var L=(e,t=!1)=>{if(t){let r=J.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 et=[{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"}],dr=et.reduce((e,t)=>(e[t.value]=t.label,e),{}),Bo=et.reduce((e,t)=>(e[t.label]=t.value,e),{}),F=e=>e.map(t=>({label:dr[t],value:t})),$o=F(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),Ho=F(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),Yo=F(["=","<>","IS NULL","IS NOT NULL"]),Wo=F(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),Go=F(["IS NULL","IS NOT NULL"]),Ko=F(["IN","NOT IN"]);var tt=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"];var jo=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var rt=e=>e.fn?e.distinct===!0?`${e.fn} distinct ${e.value}`:`${e.fn} ${e.value}`:e.value;var fe={read_only:10,editor:20,admin:30,owner:40};var C=e=>{let t=fe[e];return r=>fe[r]>=t},ot=async e=>{let t=e.routeOptions.config.requireRole;if(t&&!t(e.user.currentTeamRole))throw new s(403,"You are not authorized to perform this action")};var at=R(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=b(t),o=await f.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}=v(t);return{data:await f.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",config:{requireRole:C("admin")},handler:async t=>{let{teamId:r,ownerId:o,...a}=y(t,We),n=f.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),i=await M(L(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:l,encrypted:c}=J.encrypt(n.dbPassword);return n.dbPassword=c,n.dbPasswordIv=l,n.dbPasswordTag=u,{data:await f.save(n)}}}),e.route({method:"put",url:"/:id",config:{requireRole:C("admin")},handler:async t=>{let{id:r}=b(t),o=y(t),a=await f.findOneBy({id:r});if(!a)throw new s(404,"Data source not found");let n=f.merge(a,o);return await f.save(n),{data:n}}}),e.route({method:"delete",url:"/:id",config:{requireRole:C("admin")},handler:async(t,r)=>E.transaction(async()=>{let{id:o}=b(t);await Promise.all([P.delete({datasource:{id:o}}),O.delete({dataSource:{id:o}})]),await f.delete({id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=b(t),a=await f.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 f.save(a);let i=await(await M(L(a,!0),a.dbType,t)).inspectSchema();await P.delete({datasource:{id:o}}),await P.insert(i.sort().map(u=>P.create({tableName:u.tableName,columns:u.columns,datasource:{id:o}}))),a.status="READY",a.lastInspected=new Date,await f.save(a)}}),e.route({method:"get",url:"/:id/inspections",handler:async t=>{let{id:r}=b(t);return{data:await P.find({where:{datasource:{id:r}}})}}})});var ye=require("typeorm"),nt=R(e=>{e.route({method:"get",url:"/team/:teamId/files",handler:async(t,r)=>{let{teamId:o}=b(t),a={where:{team:{id:o}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0}},[n=[],i=[]]=await Promise.all([f.find(a),O.find({...a,where:{...a.where,isTrash:!1}})]);return{data:[...n.map(u=>({...u,type:"dataSource"})),...i.map(u=>({...u,type:"query"}))]}}}),e.route({method:"get",url:"/team/:teamId/query",handler:async t=>{let{teamId:r}=b(t),{search:o,size:a}=v(t),n=(parseInt(a)||20)/2,[i,u]=await Promise.all([P.find({where:{tableName:(0,ye.Like)(`%${o}%`),datasource:{team:{id:r}}},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:n}),O.find({where:{name:(0,ye.Like)(`%${o}%`),isTrash:!1,dataSource:{team:{id:r}}},relations:{dataSource:!0},select:{id:!0,name:!0,dataSource:{name:!0,id:!0}},order:{name:"ASC"},take:n})]),l=[];return i.forEach(c=>{l.push({name:c.tableName,id:c.id,dataSourceName:c.datasource?.name||"--",dataSourceId:c.datasource?.id||"--",type:"table"})}),u.forEach(c=>{l.push({name:c.name,id:c.id,dataSourceName:c.dataSource?.name||"--",dataSourceId:c.dataSource?.id||"--",type:"query"})}),{data:l}}})});function st(e,t=void 0){try{if(e){let r=e.split("&"),o={};for(let a of r){let n=a.split(":");o[n[0]]=n[1]}return o}}catch{}return t}var it=require("typeorm");var ut=R(e=>{e.route({method:"get",url:"/",handler:async t=>{let{dataSourceId:r,teamId:o,limit:a,orderBy:n,name:i}=v(t);if(!r&&!o)throw new s(400,"Either dsId or teamId is required");let u={isTrash:!1};return r&&(u.dataSource={id:r}),o&&(u.team={id:o}),i&&(u.name=(0,it.Like)(`%${i}%`)),{data:await O.find({where:u,take:a,order:st(n,{createdAt:"DESC"})})}}}),e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=b(t),o=await O.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:C("editor")},handler:async t=>{let r=y(t),o=await f.findOne({where:{id:r.dataSourceId},relations:{team:!0}}),a=await O.save(O.create({name:r.name,isTrash:!1,opts:r.opts,team:{id:o?.team.id},dataSource:{id:r.dataSourceId}}));return console.log("Created query!"),{data:a}}}),e.route({method:"patch",url:"/:id",config:{requireRole:C("editor")},handler:async t=>{let{id:r}=b(t),o=y(t);if(!(await O.update(r,o)).affected)throw new s(404,"Query not found");return{data:await O.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",config:{requireRole:C("editor")},handler:async t=>E.transaction(async()=>{let{id:r}=b(t);if(!(await O.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var z=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`},B={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:z,MAX:z,MIN:z,COUNT:z};var X=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`},$={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:X,MAX:X,MIN:X,COUNT:X};var ct=["SUM","COUNT","AVG","MAX","MIN"],pr=["YEAR","MONTH","DAY",...ct],fr=pr.reduce((e,t)=>(e[t]=!0,e),{}),yr=ct.reduce((e,t)=>(e[t]=!0,e),{}),Z=e=>fr[e],mt=e=>yr[e],lt=(e,t)=>e.fn&&Z(e.fn)?(t==="postgres"?B:$)[e.fn](e):e.value;var ee=e=>typeof e=="string",dt=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},H=(e,t)=>{let{column:r,operator:o,value:a,fn:n}=e,i=lt({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(p=>ee(p.value)?`'${p.value}'`:p.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":"LIKE"} '%${a?.[0].value}%'`;default:let h=a?.[0],g;return ee(h?.value)&&h?.isColumn!==!0?g=`'${h?.value}'`:g=h?.value,`${i} ${o} ${g}`}};var te=class{constructor(t="mysql"){this.dialect=t,this.skeleton={type:"SELECT"}}addWhere(t){let r=H(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=H(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 dt(this.skeleton)}};var pt=require("typeorm");var ft=async(e,{table:t,datasourceId:r,filters:o,joins:a,orderBy:n,size:i,page:u,columns:l,groupBy:c,searchAll:h})=>{let g=await f.findOne({where:{id:r},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]}),p=[t],w=[];if(!g)throw new s(404,"Data source not found");let I=new te(g.dbType);I.setTable(t),I.setLimit(i||20),I.setOffset(i*u),o?.forEach(d=>{d.fn&&mt(d.fn)?I.addHaving(d):I.addWhere(d)}),a&&(I.addJoin(...a),a.forEach(d=>{p.push(d.table)})),n&&I.addOrderBy(...n.map(d=>({...d,column:wr(d.column,g.dbType)}))),c&&c.length>0&&c.forEach(d=>I.addGroupBy(gr(d,g.dbType)));let Mt=await P.find({where:{tableName:(0,pt.In)(p),datasource:{id:r}}});for(let d of Mt)if(d.columns)for(let U of d.columns)w.push({column:U.name,table:d.tableName||"",full:`${d.tableName}.${U.name}`,type:U.type});let W;if(l&&l.length>0?W=l.map(d=>hr(d,g.dbType)):W=w.map(d=>`${d.full} as "${d.full}"`),I.selectColumns(W),h){let d=w.filter(U=>tt.includes(U.type)&&W.some(re=>re.startsWith(U.full)));if(d.length>0){let U=d.map(re=>`LOWER(${re.full}) LIKE '%${h.toLowerCase()}%'`);I.addWhereRaw(`(${U.join(" OR ")})`,"AND")}}return{...await(await M(L(g,!0),g.dbType,e)).executeQuery(I.toSQL(),{type:"SELECT",allowBulkUpdate:!1}),tables:p,allColumns:w}},yt=async(e,t)=>{let r=await f.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:l})=>typeof u=="string"?u&&u.startsWith("=")?`${l}=${u.substring(1)}`:`${l}='${u}'`:`${l}='${u}'`).join(", "),a=t.filters.map(u=>H(u,r.dbType)).join(" AND "),n=`UPDATE ${t.table} SET ${o} WHERE ${a}`;return(await M(L(r,!0),r.dbType,e)).executeQuery(n,{type:"UPDATE",allowBulkUpdate:!1})},Tt=async(e,t)=>{let r=await f.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}=Tr(t.values),n=`INSERT INTO ${t.table} (${o}) VALUES (${a})`;return(await M(L(r,!0),r.dbType,e)).executeQuery(n,{type:"INSERT",allowBulkUpdate:!1})},Tr=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}},hr=(e,t)=>{if(e.fn){if(Z(e.fn))return`${(t==="postgres"?B:$)[e.fn](e)} as "${rt(e)}"`;throw new Error("Function not allowed: "+e.fn)}return`${e.value} as "${e.value}"`},gr=(e,t)=>{if(e.fn){if(Z(e.fn))return(t==="postgres"?B:$)[e.fn](e);throw new Error("Function not allowed: "+e.fn)}return e.value},wr=(e,t)=>t==="postgres"?`"${e}"`:t==="mysql"?`\`${e}\``:e;var ht=e=>{if(!e.table)throw new s(400,"Table is required")},Er=["--",";","DROP","drop"],gt=e=>{if(ee(e.value)&&e.value.startsWith("=")){let t=e.value;Er.forEach(r=>{if(t.includes(r))throw new s(400,"Invalid input value for "+e.column)})}},wt=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(gt)},Et=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(gt)};var Rt=R(e=>{e.route({method:"post",url:"/select",handler:async t=>{let r=y(t,ht);return{data:await ft(t,r)}}}),e.route({method:"post",url:"/insert",config:{requireRole:C("editor")},handler:async t=>{let r=y(t,wt);return{data:await Tt(t,r)}}}),e.route({method:"post",url:"/update",config:{requireRole:C("editor")},handler:async t=>{let r=y(t,Et);return{data:await yt(t,r)}}})});var St=R(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:m.str("SERVER_VERSION")}}))});var bt=R(e=>{e.route({method:"get",url:"/:id/users",handler:async t=>{let{id:r}=b(t),o=await x.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:C("editor")},handler:async t=>E.transaction(async()=>{let r=t.user.id,o=y(t),a=S.create();a.id=r;let n=x.create(o);await x.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:C("admin")},handler:async t=>{let{id:r}=b(t),{role:o,userId:a}=y(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:C("admin")},handler:async t=>E.transaction(async()=>{let{id:r}=b(t),{userId:o}=v(t);if((await N.findOneBy({user:{id:o},team:{id:r}}))?.role==="owner")throw new s(400,"Cannot delete team owner");await S.update(o,{currentTeam:null}),await N.delete({user:{id:o},team:{id:r}}),await S.delete({id:o})})})});var Te=A(require("bcryptjs")),Y=async e=>{let t=await Te.default.genSalt(10);return Te.default.hash(e,t)};var Nt=R(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=y(t);if(o.password&&(o.password=await Y(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:"/",handler:async t=>E.transaction(async()=>{let r=y(t),o=await Y(r.password),a=await S.save(S.create({username:r.username,password:o})),n=await N.save(N.create({role:"read_only",team:{id:r.teamId},user:{id:a.id}}));await S.update(a.id,{currentTeam:{id:n.id}})})})});var Ct=R(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=t.user.id,o=await q.findOneBy({user:{id:r}});return o||(o=await q.save(q.create({user:{id:r}}))),{data:o}}}),e.route({method:"patch",url:"/",handler:async t=>{let{settings:r}=y(t);if(!r.id)throw new s(400,"Settings id is required!");if(!(await q.update(r.id,r)).affected)throw new s(404,"You do not own these settings!");return{data:await q.findOneBy({id:r.id})}}})});var Ut=require("node:path");var Rr=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),It=async e=>{if(Rr(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 ke(o),n=await N.findOneBy({user:{id:a}});if(!n)throw new s(401,"User is not part of a team");e.user={id:a,currentTeamRole:n.role}}catch{throw new s(401,"Unauthorized")}};var Ot=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var xt=A(require("@fastify/cookie"));var he={teamName:"Default Team",username:"admin",password:"admin"},Sr=async()=>{let e=await x.findOneBy({});return e||x.save(x.create({name:he.teamName}))},At=async()=>{let e=await N.findOne({where:{role:"owner"},relations:{user:!0}});if(e)return e.user;let t=await Sr(),r=await Y(he.password),o=await S.save(S.create({username:he.username,password:r})),a=await N.save(N.create({user:o,team:t,role:"owner"}));return await S.update(o.id,{currentTeam:a}),o};var _=(0,_t.default)(),vt=m.num("PORT",4466),br=m.bool("HOST")?"0.0.0.0":"127.0.0.1",Nr=m.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),Cr=["https://app.dataramen.xyz","https://dataramen.xyz",`http://localhost:${vt}`,...Nr];function D(e,t){_.register(e,{prefix:t}),console.log("Registered "+t)}(async function(){Ee(),await Me(),await _.register(xt.default,{}),await _.register(Pt.default,{origin:(t,r)=>{!t||Cr.includes(t)?r(null,!0):r(new Error("Not allowed by CORS"),!1)},methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),await _.register(Dt.default,{root:(0,Ut.join)(__dirname,"web")}),_.get("/",(t,r)=>{r.sendFile("index.html")}),_.addHook("onRequest",It),_.addHook("onRequest",ot),_.addHook("onResponse",Ot),D(Ye,"/api/auth"),D(at,"/api/data-sources"),D(nt,"/api/project"),D(ut,"/api/queries"),D(Rt,"/api/runner"),D(St,"/api/status"),D(bt,"/api/teams"),D(Nt,"/api/users"),D(Ct,"/api/user-settings"),_.setNotFoundHandler((t,r)=>{if(t.raw.url?.startsWith("/api/")){r.code(404).send({error:"API route not found"});return}r.sendFile("index.html")}),_.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 _.after(),await De(),await At(),_.listen({port:vt,host:br},(t,r)=>{t&&(console.error(t),process.exit(1)),console.log(`Server listening at ${r}`)})})();
|