@dataramen/cli 0.0.84 → 0.0.85-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/code/server.js +9 -9
- package/dist/code/web/assets/index-5Zg4gcCM.css +1 -0
- package/dist/code/web/assets/{index-D8gKTOYX.js → index-B8uj6NzK.js} +10 -10
- package/dist/code/web/assets/main-CCE28-cR.js +4 -0
- package/dist/code/web/assets/main-ayAbqnAy.css +1 -0
- package/dist/code/web/assets/{setup-MoGvdW5M.js → setup-cu-l_kwm.js} +1 -1
- package/dist/code/web/index.html +4 -4
- package/dist/code/web/setup.html +3 -3
- package/dist/package.json +1 -1
- package/package.json +1 -1
- package/dist/code/web/assets/index-l5Nfyosj.css +0 -1
- package/dist/code/web/assets/main-Chd7GySZ.css +0 -1
- package/dist/code/web/assets/main-Dyxn9IRv.js +0 -4
package/dist/code/server.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
"use strict";var fo=Object.create;var We=Object.defineProperty;var yo=Object.getOwnPropertyDescriptor;var To=Object.getOwnPropertyNames;var go=Object.getPrototypeOf,ho=Object.prototype.hasOwnProperty;var bo=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of To(t))!ho.call(e,a)&&a!==r&&We(e,a,{get:()=>t[a],enumerable:!(o=yo(t,a))||o.enumerable});return e};var O=(e,t,r)=>(r=e!=null?fo(go(e)):{},bo(t||!e||!e.__esModule?We(r,"default",{value:e,enumerable:!0}):r,e));var se=require("dotenv"),ie=require("node:path"),Ge=require("node:fs");var ae=e=>{function t(a,n=void 0){return e[a]||n}function r(a,n=void 0){let i=e[a];if(!i)return n;let s=Number(i);return!isNaN(s)&&i.trim()!==""?s:n}function o(a){return e[a]==="true"||e[a]==="TRUE"||e[a]==="1"}return{str:t,num:r,bool:o}};function wo(e){let t={mode:void 0,env:void 0};for(let r of e){if(!r.startsWith("--"))continue;let[o,...a]=r.slice(2).split("=");if(!o||a.length===0)continue;let n=a.join("=");n=n.replace(/^["'](.+)["']$/,"$1"),t[o]=n}return t}var ne=ae(wo(process.argv.slice(2)));var So=(()=>{try{let e=(0,Ge.readFileSync)((0,ie.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})(),Ye=[],He=ne.str("env");He&&Ye.push((0,ie.resolve)(He));(0,se.config)({path:Ye});var Ce={APP_DB_TYPE:"sqlite",APP_DB_DATABASE:"<home>/.dataramen/.runtime/db.sqlite3"};(0,se.populate)(process.env,{SERVER_VERSION:So.version,PROD:"true",...Ce},{override:!1});var Io=["SYMM_ENCRYPTION_KEY","JWT_SECRET","JWT_REFRESH_SECRET"],je=()=>{let e=[];for(let t of Io)process.env[t]||e.push(t);if(e.length>0)throw new Error("Following env variables are required but not provided: "+e.join(", "))},T=ae(process.env),Ke=()=>T.str("APP_DB_TYPE")!==Ce.APP_DB_TYPE&&T.str("APP_DB_DATABASE")!==Ce.APP_DB_DATABASE;var Vm=require("reflect-metadata"),ao=O(require("fastify")),no=O(require("qs"));var it=require("typeorm");var Ve=require("typeorm");var Eo={default:{bindServerUrl:"0.0.0.0",skipAuth:!1,name:"default"},docker:{bindServerUrl:"0.0.0.0",skipAuth:!1,name:"docker"},cli:{bindServerUrl:"127.0.0.1",skipAuth:!0,name:"cli"},dev:{bindServerUrl:"127.0.0.1",skipAuth:!0,name:"dev"}},Co=ne.str("mode","default"),D=Eo[Co];var g=T.str("APP_DB_TYPE")==="sqlite"?"datetime":"timestamp",ue=D.name==="docker"?e=>e==="localhost"||e==="127.0.0.1"?"host.docker.internal":e:e=>e;var Re=new Ve.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0}},relations:{users:{type:"one-to-many",target:()=>"UsersToTeams",inverseSide:"team"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"team"},datasources:{type:"one-to-many",target:()=>"DataSource",inverseSide:"team"}}});var ze=require("typeorm");var Ne=new ze.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0},username:{type:String,unique:!0},password:{type:String}},relations:{teams:{type:"one-to-many",target:()=>"UsersToTeams",inverseSide:"user"},settings:{type:"one-to-one",target:()=>"UserSettings",inverseSide:"user"},currentTeam:{type:"one-to-one",target:()=>"UsersToTeams",inverseSide:"user",joinColumn:!0},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"user"}}});var Je=require("typeorm");var Ae=new Je.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var Xe=require("typeorm");var F=new Xe.EntitySchema({name:"DataSource",tableName:"data_sources",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},dbUrl:{type:String},dbPort:{type:Number,nullable:!0},dbUser:{type:String},dbPassword:{type:String,nullable:!0,select:!1},dbPasswordIv:{type:String,nullable:!0,select:!1},dbPasswordTag:{type:String,nullable:!0,select:!1},dbType:{type:String},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0},name:{type:String},description:{type:String,nullable:!0},dbDatabase:{type:String},dbSchema:{type:String,nullable:!0},allowInsert:{type:Boolean,default:!1},allowUpdate:{type:Boolean,default:!1},lastInspected:{type:g,nullable:!0,default:null},status:{type:String,nullable:!0}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"datasources",joinColumn:!0},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"dataSource"},owner:{type:"many-to-one",target:()=>"User",joinColumn:!0}}});var ut=O(require("node:os")),ct=require("node:path");var Ze=require("typeorm");var K=new Ze.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",nullable:!1},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"queries",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",inverseSide:"datasources",joinColumn:!0},user:{type:"many-to-one",target:()=>"User",inverseSide:"queries",joinColumn:!0,nullable:!0},savedQueries:{type:"one-to-many",target:()=>"SavedQuery",inverseSide:"query"}}});var et=require("typeorm"),Pe=new et.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 tt=require("typeorm");var V=new tt.EntitySchema({name:"SavedQuery",tableName:"saved_queries",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},isPersonal:{type:Boolean},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0},searchString:{type:String,default:()=>null}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"queries",joinColumn:!0},user:{type:"many-to-one",target:()=>"User",inverseSide:"queries",joinColumn:!0,nullable:!0},query:{type:"one-to-one",target:()=>"Query",joinColumn:!0,nullable:!1}}});var rt=require("typeorm");var z=new rt.EntitySchema({name:"WorkbenchTab",tableName:"workbench_tabs",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0},opts:{type:"json",nullable:!1},archived:{type:Boolean,default:!1},orderIndex:{type:Number,default:0},searchString:{type:String,default:()=>null}},relations:{team:{type:"many-to-one",target:()=>"Team",joinColumn:!0},user:{type:"many-to-one",target:()=>"User",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",joinColumn:!0}}});var ot=require("typeorm");var M=new ot.EntitySchema({name:"DatabaseColumn",tableName:"database_columns",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},name:{nullable:!0,type:String},type:{type:String},isPrimary:{type:Boolean},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0},meta:{type:"json",nullable:!0},tableId:{type:String}},relations:{table:{target:()=>"DatabaseTable",type:"many-to-one",inverseSide:"columns"}}});var at=require("typeorm");var q=new at.EntitySchema({name:"DatabaseTable",tableName:"database_tables",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{nullable:!0,type:String},createdAt:{type:g,createDate:!0},updatedAt:{type:g,updateDate:!0}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinColumn:{name:"dataSourceId"}},columns:{target:()=>"DatabaseColumn",type:"one-to-many",inverseSide:"table"}}});var nt=require("uuid");function Ro(e){let t={};for(let r of e.entityMetadatas)for(let o of r.columns)o.isPrimary&&o.generationStrategy==="uuid"&&(t[r.name]?t[r.name].push(o.propertyName):t[r.name]=[o.propertyName]);return t}function No(e){let t=Ro(e);return{beforeInsert(r){if(t[r.metadata.name])for(let o of t[r.metadata.name])r.entity[o]||(r.entity[o]=(0,nt.v4)())}}}var st=e=>{e.subscribers.push(No(e))};function Ao(){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>",ut.default.homedir())),e}var b=new it.DataSource({type:T.str("APP_DB_TYPE"),database:Ao(),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:[ct.posix.join(__dirname,"migrations","*.js")],entities:[F,Re,Ne,Pe,Ae,K,V,z,q,M]}),mt=async()=>{if(!b.isInitialized)return b.initialize().then(e=>(st(e),e));throw new Error("Already initialized")},C=b.getRepository(F),B=b.getRepository(Re),w=b.getRepository(Ne),R=b.getRepository(Pe),H=b.getRepository(Ae),N=b.getRepository(K),U=b.getRepository(V),S=b.getRepository(z),ce=b.getRepository(M),me=b.getRepository(q);var lt=T.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),dt=T.num("PORT",4466),J={port:dt,host:D.bindServerUrl,allowedOrigins:lt.includes("*")?"*":[`http://localhost:${dt}`,...lt]};var h=e=>(t,r,o)=>{e(t),o()};var X=require("jose");var u=class extends Error{constructor(r,o){super(o);this.status=r;this.message=o}};var pt=new TextEncoder,ft=pt.encode(T.str("JWT_SECRET")),yt=pt.encode(T.str("JWT_REFRESH_SECRET")),Oe=async({userId:e})=>new X.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign(ft),De=async({userId:e})=>new X.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign(yt),Tt=async(e,t)=>{try{let{payload:r}=await(0,X.jwtVerify)(e,t);if(!r.sub)throw new u(401,"Failed to verify access token");return{userId:r.sub}}catch(r){throw r instanceof u?r:r instanceof Error?new u(401,r.message):new u(401,"Failed to verify refresh token")}},gt=async e=>Tt(e,ft),ht=async e=>Tt(e,yt);var f=(e,t)=>{let r=e.body;return t&&t(r),r},_=(e,t)=>{let r=e.query;return t&&t(r),r},p=(e,t)=>{let r=e.params;return t&&t(r),r};var wt=O(require("bcryptjs"));var bt=e=>{if(!e?.username)throw new u(400,"Username is required");if(!e?.password)throw new u(400,"Password is required")};var le="DATARAMEN_refresh_token",ve={httpOnly:!0,secure:T.bool("PROD"),sameSite:T.bool("PROD"),path:"/",maxAge:14400*60},St=h(e=>{e.route({method:"post",url:"/login",config:{isPublic:!0},handler:async(t,r)=>{let{username:o,password:a}=f(t,bt),n=await w.findOne({where:{username:o}});if(!n||!wt.default.compareSync(a,n.password))throw new u(401,"Invalid credentials");let[i,s]=await Promise.all([Oe({userId:n?.id}),De({userId:n?.id})]);return r.setCookie(le,s,ve),{data:{accessToken:i}}}}),e.route({method:"post",url:"/refresh",config:{isPublic:!0},handler:async(t,r)=>{let o=t.cookies[le];if(!o)return r.code(401).send({message:"Missing refresh token"});let{userId:a}=await ht(o),[n,i]=await Promise.all([Oe({userId:a}),De({userId:a})]);return r.setCookie(le,i,ve),{data:{accessToken:n}}}}),e.route({method:"post",url:"/logout",config:{isPublic:!0},handler:async(t,r)=>(r.clearCookie(le,ve),{data:!0})})});var It=e=>{if(!e.dbUrl)throw new u(400,"url is required");if(!e.dbUser)throw new u(400,"user is required");if(!e.dbType)throw new u(400,"type is required");if(!e.name)throw new u(400,"name is required");if(!e.dbDatabase)throw new u(400,"database is required")};var Rt=O(require("mysql2/promise"));function Z(e){if(e!==void 0)return e.toLowerCase()}var Po=({database:e,password:t,user:r,url:o})=>Rt.default.createConnection({host:ue(o),user:r,database:e,password:t,dateStrings:!0,multipleStatements:!1}),Oo=async e=>{let t=`
|
|
1
|
+
"use strict";var po=Object.create;var $e=Object.defineProperty;var fo=Object.getOwnPropertyDescriptor;var yo=Object.getOwnPropertyNames;var To=Object.getPrototypeOf,ho=Object.prototype.hasOwnProperty;var go=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of yo(t))!ho.call(e,a)&&a!==r&&$e(e,a,{get:()=>t[a],enumerable:!(o=fo(t,a))||o.enumerable});return e};var O=(e,t,r)=>(r=e!=null?po(To(e)):{},go(t||!e||!e.__esModule?$e(r,"default",{value:e,enumerable:!0}):r,e));var se=require("dotenv"),ie=require("node:path"),He=require("node:fs");var ae=e=>{function t(a,n=void 0){return e[a]||n}function r(a,n=void 0){let s=e[a];if(!s)return n;let u=Number(s);return!isNaN(u)&&s.trim()!==""?u:n}function o(a){return e[a]==="true"||e[a]==="TRUE"||e[a]==="1"}return{str:t,num:r,bool:o}};function bo(e){let t={mode:void 0,env:void 0};for(let r of e){if(!r.startsWith("--"))continue;let[o,...a]=r.slice(2).split("=");if(!o||a.length===0)continue;let n=a.join("=");n=n.replace(/^["'](.+)["']$/,"$1"),t[o]=n}return t}var ne=ae(bo(process.argv.slice(2)));var wo=(()=>{try{let e=(0,He.readFileSync)((0,ie.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})(),Ye=[],We=ne.str("env");We&&Ye.push((0,ie.resolve)(We));(0,se.config)({path:Ye});var Ce={APP_DB_TYPE:"sqlite",APP_DB_DATABASE:"<home>/.dataramen/.runtime/db.sqlite3"};(0,se.populate)(process.env,{SERVER_VERSION:wo.version,PROD:"true",...Ce},{override:!1});var So=["SYMM_ENCRYPTION_KEY","JWT_SECRET","JWT_REFRESH_SECRET"],Ge=()=>{let e=[];for(let t of So)process.env[t]||e.push(t);if(e.length>0)throw new Error("Following env variables are required but not provided: "+e.join(", "))},T=ae(process.env),je=()=>T.str("APP_DB_TYPE")!==Ce.APP_DB_TYPE&&T.str("APP_DB_DATABASE")!==Ce.APP_DB_DATABASE;var Km=require("reflect-metadata"),ao=O(require("fastify")),no=O(require("qs"));var st=require("typeorm");var Ke=require("typeorm");var Io={default:{bindServerUrl:"0.0.0.0",skipAuth:!1,name:"default"},docker:{bindServerUrl:"0.0.0.0",skipAuth:!1,name:"docker"},cli:{bindServerUrl:"127.0.0.1",skipAuth:!0,name:"cli"},dev:{bindServerUrl:"127.0.0.1",skipAuth:!0,name:"dev"}},Eo=ne.str("mode","default"),D=Io[Eo];var h=T.str("APP_DB_TYPE")==="sqlite"?"datetime":"timestamp",ue=D.name==="docker"?e=>e==="localhost"||e==="127.0.0.1"?"host.docker.internal":e:e=>e;var Re=new Ke.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:h,createDate:!0},updatedAt:{type:h,updateDate:!0}},relations:{users:{type:"one-to-many",target:()=>"UsersToTeams",inverseSide:"team"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"team"},datasources:{type:"one-to-many",target:()=>"DataSource",inverseSide:"team"}}});var Ve=require("typeorm");var Ne=new Ve.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:h,createDate:!0},updatedAt:{type:h,updateDate:!0},username:{type:String,unique:!0},password:{type:String}},relations:{teams:{type:"one-to-many",target:()=>"UsersToTeams",inverseSide:"user"},settings:{type:"one-to-one",target:()=>"UserSettings",inverseSide:"user"},currentTeam:{type:"one-to-one",target:()=>"UsersToTeams",inverseSide:"user",joinColumn:!0},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"user"}}});var ze=require("typeorm");var Ae=new ze.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:h,createDate:!0},updatedAt:{type:h,updateDate:!0}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var Je=require("typeorm");var F=new Je.EntitySchema({name:"DataSource",tableName:"data_sources",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},dbUrl:{type:String},dbPort:{type:Number,nullable:!0},dbUser:{type:String},dbPassword:{type:String,nullable:!0,select:!1},dbPasswordIv:{type:String,nullable:!0,select:!1},dbPasswordTag:{type:String,nullable:!0,select:!1},dbType:{type:String},createdAt:{type:h,createDate:!0},updatedAt:{type:h,updateDate:!0},name:{type:String},description:{type:String,nullable:!0},dbDatabase:{type:String},dbSchema:{type:String,nullable:!0},allowInsert:{type:Boolean,default:!1},allowUpdate:{type:Boolean,default:!1},lastInspected:{type:h,nullable:!0,default:null},status:{type:String,nullable:!0}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"datasources",joinColumn:!0},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"dataSource"},owner:{type:"many-to-one",target:()=>"User",joinColumn:!0}}});var it=O(require("node:os")),ut=require("node:path");var Xe=require("typeorm");var V=new Xe.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",nullable:!1},createdAt:{type:h,createDate:!0},updatedAt:{type:h,updateDate:!0}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"queries",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",inverseSide:"datasources",joinColumn:!0},user:{type:"many-to-one",target:()=>"User",inverseSide:"queries",joinColumn:!0,nullable:!0},savedQueries:{type:"one-to-many",target:()=>"SavedQuery",inverseSide:"query"}}});var Ze=require("typeorm"),Pe=new Ze.EntitySchema({name:"UsersToTeams",tableName:"users_to_teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},role:{type:"varchar",default:"admin",nullable:!1}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"users"},user:{type:"many-to-one",target:()=>"User",inverseSide:"teams"}}});var et=require("typeorm");var z=new et.EntitySchema({name:"SavedQuery",tableName:"saved_queries",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},isPersonal:{type:Boolean},createdAt:{type:h,createDate:!0},updatedAt:{type:h,updateDate:!0},searchString:{type:String,default:()=>null}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"queries",joinColumn:!0},user:{type:"many-to-one",target:()=>"User",inverseSide:"queries",joinColumn:!0,nullable:!0},query:{type:"one-to-one",target:()=>"Query",joinColumn:!0,nullable:!1}}});var tt=require("typeorm");var J=new tt.EntitySchema({name:"WorkbenchTab",tableName:"workbench_tabs",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:h,createDate:!0},updatedAt:{type:h,updateDate:!0},opts:{type:"json",nullable:!1},archived:{type:Boolean,default:!1},orderIndex:{type:Number,default:0},searchString:{type:String,default:()=>null}},relations:{team:{type:"many-to-one",target:()=>"Team",joinColumn:!0},user:{type:"many-to-one",target:()=>"User",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",joinColumn:!0}}});var rt=require("typeorm");var M=new rt.EntitySchema({name:"DatabaseColumn",tableName:"database_columns",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},name:{nullable:!0,type:String},type:{type:String},isPrimary:{type:Boolean},createdAt:{type:h,createDate:!0},updatedAt:{type:h,updateDate:!0},meta:{type:"json",nullable:!0},tableId:{type:String}},relations:{table:{target:()=>"DatabaseTable",type:"many-to-one",inverseSide:"columns"}}});var ot=require("typeorm");var q=new ot.EntitySchema({name:"DatabaseTable",tableName:"database_tables",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{nullable:!0,type:String},createdAt:{type:h,createDate:!0},updatedAt:{type:h,updateDate:!0}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinColumn:{name:"dataSourceId"}},columns:{target:()=>"DatabaseColumn",type:"one-to-many",inverseSide:"table"}}});var at=require("uuid");function Co(e){let t={};for(let r of e.entityMetadatas)for(let o of r.columns)o.isPrimary&&o.generationStrategy==="uuid"&&(t[r.name]?t[r.name].push(o.propertyName):t[r.name]=[o.propertyName]);return t}function Ro(e){let t=Co(e);return{beforeInsert(r){if(t[r.metadata.name])for(let o of t[r.metadata.name])r.entity[o]||(r.entity[o]=(0,at.v4)())}}}var nt=e=>{e.subscribers.push(Ro(e))};function No(){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>",it.default.homedir())),e}var b=new st.DataSource({type:T.str("APP_DB_TYPE"),database:No(),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:[ut.posix.join(__dirname,"migrations","*.js")],entities:[F,Re,Ne,Pe,Ae,V,z,J,q,M]}),ct=async()=>{if(!b.isInitialized)return b.initialize().then(e=>(nt(e),e));throw new Error("Already initialized")},E=b.getRepository(F),B=b.getRepository(Re),w=b.getRepository(Ne),R=b.getRepository(Pe),Y=b.getRepository(Ae),N=b.getRepository(V),U=b.getRepository(z),S=b.getRepository(J),ce=b.getRepository(M),me=b.getRepository(q);var mt=T.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),lt=T.num("PORT",4466),X={port:lt,host:D.bindServerUrl,allowedOrigins:mt.includes("*")?"*":[`http://localhost:${lt}`,...mt]};var g=e=>(t,r,o)=>{e(t),o()};var Z=require("jose");var i=class extends Error{constructor(r,o){super(o);this.status=r;this.message=o}};var dt=new TextEncoder,pt=dt.encode(T.str("JWT_SECRET")),ft=dt.encode(T.str("JWT_REFRESH_SECRET")),Oe=async({userId:e})=>new Z.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign(pt),De=async({userId:e})=>new Z.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign(ft),yt=async(e,t)=>{try{let{payload:r}=await(0,Z.jwtVerify)(e,t);if(!r.sub)throw new i(401,"Failed to verify access token");return{userId:r.sub}}catch(r){throw r instanceof i?r:r instanceof Error?new i(401,r.message):new i(401,"Failed to verify refresh token")}},Tt=async e=>yt(e,pt),ht=async e=>yt(e,ft);var y=(e,t)=>{let r=e.body;return t&&t(r),r},x=(e,t)=>{let r=e.query;return t&&t(r),r},f=(e,t)=>{let r=e.params;return t&&t(r),r};var bt=O(require("bcryptjs"));var gt=e=>{if(!e?.username)throw new i(400,"Username is required");if(!e?.password)throw new i(400,"Password is required")};var le="DATARAMEN_refresh_token",ve={httpOnly:!0,secure:T.bool("PROD"),sameSite:T.bool("PROD"),path:"/",maxAge:14400*60},wt=g(e=>{e.route({method:"post",url:"/login",config:{isPublic:!0},handler:async(t,r)=>{let{username:o,password:a}=y(t,gt),n=await w.findOne({where:{username:o}});if(!n||!bt.default.compareSync(a,n.password))throw new i(401,"Invalid credentials");let[s,u]=await Promise.all([Oe({userId:n?.id}),De({userId:n?.id})]);return r.setCookie(le,u,ve),{data:{accessToken:s}}}}),e.route({method:"post",url:"/refresh",config:{isPublic:!0},handler:async(t,r)=>{let o=t.cookies[le];if(!o)return r.code(401).send({message:"Missing refresh token"});let{userId:a}=await ht(o),[n,s]=await Promise.all([Oe({userId:a}),De({userId:a})]);return r.setCookie(le,s,ve),{data:{accessToken:n}}}}),e.route({method:"post",url:"/logout",config:{isPublic:!0},handler:async(t,r)=>(r.clearCookie(le,ve),{data:!0})})});var St=e=>{if(!e.dbUrl)throw new i(400,"url is required");if(!e.dbUser)throw new i(400,"user is required");if(!e.dbType)throw new i(400,"type is required");if(!e.name)throw new i(400,"name is required");if(!e.dbDatabase)throw new i(400,"database is required")};var Ct=O(require("mysql2/promise"));function ee(e){if(e!==void 0)return e.toLowerCase()}var Ao=({database:e,password:t,user:r,url:o})=>Ct.default.createConnection({host:ue(o),user:r,database:e,password:t,dateStrings:!0,multipleStatements:!1}),Po=async e=>{let t=`
|
|
2
2
|
SELECT LOWER(TABLE_NAME) as TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION
|
|
3
3
|
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
|
|
4
4
|
WHERE CONSTRAINT_NAME = 'PRIMARY'
|
|
5
5
|
ORDER BY TABLE_NAME, ORDINAL_POSITION;
|
|
6
|
-
`,[r]=await e.execute(t),o={};return r.forEach(a=>{let n=
|
|
6
|
+
`,[r]=await e.execute(t),o={};return r.forEach(a=>{let n=ee(a.TABLE_NAME),s=a.COLUMN_NAME;o[n]||(o[n]=[]),o[n].push(s)}),o},Oo=async e=>{let t=`
|
|
7
7
|
SELECT
|
|
8
8
|
LOWER(TABLE_NAME) AS table_name,
|
|
9
9
|
COLUMN_NAME AS field,
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
WHERE
|
|
15
15
|
REFERENCED_TABLE_NAME IS NOT NULL
|
|
16
16
|
AND CONSTRAINT_SCHEMA = DATABASE();
|
|
17
|
-
`,[r]=await e.execute(t),o={};return Array.isArray(r)&&r.forEach(a=>{o[a.table_name]||(o[a.table_name]={}),o[a.table_name][a.field]={refTable:a.referenced_table,refField:a.referenced_field}}),o},
|
|
17
|
+
`,[r]=await e.execute(t),o={};return Array.isArray(r)&&r.forEach(a=>{o[a.table_name]||(o[a.table_name]={}),o[a.table_name][a.field]={refTable:a.referenced_table,refField:a.referenced_field}}),o},Do=async(e,t)=>{let o=(await t.query("SHOW TABLES"))[0],a=await Oo(t),n=await Po(t),s=o.map(async u=>{let c=ee(Object.values(u)[0]),l=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${e.database}' and LOWER(table_name) = '${c}'`,[m]=await t.query(l),d=a[c];return{columns:m.map(p=>({name:p.COLUMN_NAME,type:p.DATA_TYPE,isPrimary:n[c]?.includes(p.COLUMN_NAME),ref:d?.[p.COLUMN_NAME]?{table:d[p.COLUMN_NAME].refTable,field:d[p.COLUMN_NAME].refField}:void 0})),createdAt:new Date,tableName:c,updatedAt:new Date}});return Promise.all(s)},It=async(e,t,r,o)=>{try{console.log(`[MYSQL CONN] Query: ${e}`),console.log(`[MYSQL CONN] Params: ${JSON.stringify(t)}`);let[a,n]=await r.query({sql:e,rowsAsArray:!0,values:t,timeout:1e4}),s=a?.constructor?.name;if(s==="ResultSetHeader"){let u=a;if(u.affectedRows>1&&o.allowBulkUpdate!==!0)throw new Error("[MYSQL CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[u.affectedRows]],query:e}}else if(s==="Array"){let u=a;return{columns:n?.map(c=>({column:c.orgName||c.name,table:ee(c.orgTable),alias:c.name,full:c.orgTable?ee(c.orgTable)+"."+c.orgName:c.name}))||[],rows:u,query:e}}throw new Error(`[MYSQL CONN] Unknown result type: ${s}`)}catch(a){throw console.error(a),a instanceof i?a:new i(400,a.message)}},vo=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}},xo=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}},xe=async e=>{let t=await Ao(e),r=!1;return{dbType:"mysql",dataSource:e,inspectSchema:()=>Do(e,t),executeQuery:o=>o.type==="SELECT"?xo(t,()=>It(o.sql,o.params,t,o)):vo(t,()=>It(o.sql,o.params,t,o)),checkConnection:async()=>t.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.destroy()}}};var Nt=O(require("pg"));var _o=async({database:e,password:t,user:r,url:o,port:a})=>{let n=new Nt.default.Client({host:ue(o),user:r,database:e,password:t,port:a,query_timeout:1e4});return await n.connect(),n},Uo=async e=>{let r=await e.query(`
|
|
18
18
|
SELECT
|
|
19
19
|
LOWER(kcu.table_name) as table_name,
|
|
20
20
|
kcu.column_name,
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
tc.constraint_type = 'PRIMARY KEY'
|
|
29
29
|
ORDER BY
|
|
30
30
|
table_name, kcu.ordinal_position;
|
|
31
|
-
`),o={};return r.rows.forEach(a=>{let n=a.table_name,
|
|
31
|
+
`),o={};return r.rows.forEach(a=>{let n=a.table_name,s=a.column_name;o[n]||(o[n]=[]),o[n].push(s)}),o},ko=async e=>{let r=await e.query(`
|
|
32
32
|
SELECT
|
|
33
33
|
LOWER(tc.table_name) AS table_name,
|
|
34
34
|
kcu.column_name AS field,
|
|
@@ -43,20 +43,20 @@
|
|
|
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},Lo=async(e,t)=>{let r=`SELECT LOWER(tablename) as tablename FROM pg_catalog.pg_tables WHERE schemaname = '${e.schema}'`,a=(await t.query(r)).rows,n=await ko(t),s=await Uo(t),u=a.map(async c=>{let l=Object.values(c)[0],m=`
|
|
47
47
|
SELECT column_name, data_type
|
|
48
48
|
FROM information_schema.columns
|
|
49
49
|
WHERE
|
|
50
|
-
LOWER(table_name) = '${
|
|
50
|
+
LOWER(table_name) = '${l}' and
|
|
51
51
|
table_schema = '${e.schema}'
|
|
52
|
-
`,{rows:
|
|
52
|
+
`,{rows:d}=await t.query(m),p=n[l];return{columns:d.map(A=>({name:A.column_name,type:A.data_type,isPrimary:s[l]?.includes(A.column_name),ref:p?.[A.column_name]?{table:p[A.column_name].refTable,field:p[A.column_name].refField}:void 0})).sort((A,_)=>A.isPrimary&&_.isPrimary?A.name.localeCompare(_.name):A.isPrimary?-1:1),createdAt:new Date,tableName:l,updatedAt:new Date}});return Promise.all(u)},qo=async(e,t)=>{let r=`select LOWER(relname) as relname, attname, concat(pg_class.oid, '-', attnum) as row_key
|
|
53
53
|
from pg_attribute
|
|
54
54
|
left join pg_class on pg_attribute.attrelid = pg_class.oid
|
|
55
55
|
where
|
|
56
56
|
concat(pg_class.oid, '-', attnum) IN (${e.join(", ")})
|
|
57
|
-
limit 75;`;return(await t.query(r)).rows.reduce((a,n)=>(a[n.row_key]={table:n.relname,column:n.attname},a),{})},
|
|
57
|
+
limit 75;`;return(await t.query(r)).rows.reduce((a,n)=>(a[n.row_key]={table:n.relname,column:n.attname},a),{})},Rt=async(e,t,r,o)=>{try{console.log(`[PG CONN] Query: ${e}`),console.log(`[PG CONN] Params: ${JSON.stringify(t,null,2)}`);let{rows:a,fields:n,command:s,rowCount:u}=await r.query({text:e,rowMode:"array",values:t});if(s==="UPDATE"||s==="INSERT"||s==="DELETE"){if(u!=null&&u>1&&o.allowBulkUpdate!==!0)throw new Error("[PG CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[u]],query:e}}if(s==="SELECT"){let c=n.map(m=>`'${m.tableID}-${m.columnID}'`),l=await qo(c,r);return{columns:n.map(m=>{let d=l[`${m.tableID}-${m.columnID}`];return{column:d?.column||m.name,alias:m.name,table:d?.table||"",full:d?d.table+"."+d.column:m.name}}),rows:a,query:e}}throw new Error(`[PG CONN] Unsupported command: ${s}`)}catch(a){throw a instanceof i?a:new i(400,a.message)}},Bo=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}},Qo=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}},_e=async e=>{let t=await _o(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:()=>Lo(e,t),executeQuery:n=>a(()=>n.type==="SELECT"?Qo(t,()=>Rt(n.sql,n.params,t,n)):Bo(t,()=>Rt(n.sql,n.params,t,n))),checkConnection:async()=>{await a(()=>t.query("SELECT 1;"))},isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.end()}}};var $=async(e,t,r)=>{try{let o;if(t==="mysql")o=await xe(e);else if(t==="postgres")o=await _e(e);else throw new i(500,`Connection manager for ${t} not found`);return r.__connections?r.__connections.push(o):r.__connections=[o],o}catch(o){throw console.error(o),o instanceof i?o:o?.code==="ECONNREFUSED"?new i(500,"Failed to connect to the database"):new i(500,o.message)}},At=async(e,t)=>{try{let r;if(t==="mysql")r=await xe(e);else if(t==="postgres")r=await _e(e);else throw new i(500,`Connection manager for ${t} not found`);return r}catch(r){throw console.error(r),r instanceof i?r:r?.code==="ECONNREFUSED"?new i(500,"Failed to connect to the database"):new i(500,r.message)}};var de=O(require("node:crypto"));var Pt="aes-256-gcm",Fo=12,Ot=()=>{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},Mo=e=>{let t=de.default.randomBytes(Fo),r=Ot(),o=de.default.createCipheriv(Pt,r,t),a=o.update(e,"utf8","hex");a+=o.final("hex");let n=o.getAuthTag();return{encrypted:a,iv:t.toString("hex"),tag:n.toString("hex")}},$o=({encrypted:e,iv:t,tag:r})=>{let o=Ot(),a=de.default.createDecipheriv(Pt,o,Buffer.from(t,"hex"));a.setAuthTag(Buffer.from(r,"hex"));let n=a.update(e,"hex","utf8");return n+=a.final("utf8"),n},pe={encrypt:Mo,decrypt:$o};var k=(e,t=!1)=>{if(t){let r=pe.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 Dt=[{value:"=",label:"equals"},{value:"<>",label:"not equal"},{value:">",label:"greater than"},{value:">=",label:"greater than or equal"},{value:"<",label:"less than"},{value:"<=",label:"less than or equal"},{value:"LIKE",label:"like"},{value:"NOT LIKE",label:"not like"},{value:"CONTAINS",label:"contains"},{value:"NOT CONTAINS",label:"not contains"},{value:"IN",label:"in list"},{value:"NOT IN",label:"not in list"},{value:"IS NULL",label:"is null"},{value:"IS NOT NULL",label:"is not null"}],Wo=Dt.reduce((e,t)=>(e[t.value]=t.label,e),{}),Is=Dt.reduce((e,t)=>(e[t.label]=t.value,e),{}),G=e=>e.map(t=>({label:Wo[t],value:t})),Es=G(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),Cs=G(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL","CONTAINS","NOT CONTAINS"]),Rs=G(["=","<>","IS NULL","IS NOT NULL"]),Ns=G(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),As=G(["IS NULL","IS NOT NULL"]),Ps=G(["IN","NOT IN"]),Ho=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"],Yo=new Set(Ho),fe=e=>Yo.has(e),Go=["integer","smallint","decimal","numeric","float","real","double precision","int","smallint","integer","bigint","decimal","numeric","real","double precision","serial","bigserial","money"],jo=new Set(Go),vt=e=>jo.has(e);var Os=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var Ue={read_only:10,editor:20,admin:30,owner:40};var P=e=>e.startsWith("'")&&e.endsWith("'")||e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e;var xt={operator:"LIKE",parse:e=>{let t=e.match(/^LIKE\s*["'](.*)["']$/i);if(t)return[{value:P(t[1])}]},stringify:e=>`LIKE "%${e[0]?.value}%"`},_t={operator:"NOT LIKE",parse:e=>{let t=e.match(/^NOT LIKE\s*["'](.*)["']$/i);if(t)return[{value:P(t[1])}]},stringify:e=>`NOT LIKE "%${e[0]?.value}%"`},Ut={operator:"CONTAINS",parse:e=>{let t=e.match(/^CONTAINS\s*["'](.*)["']$/i);if(t)return[{value:P(t[1])}]},stringify:(e,t)=>fe(t)?`${e[0]?.value}`:`CONTAINS "%${e[0]?.value}%"`},kt={operator:"NOT CONTAINS",parse:e=>{let t=e.match(/^NOT CONTAINS\s*["'](.*)["']$/i);if(t)return[{value:P(t[1])}]},stringify:e=>`NOT CONTAINS "%${e[0]?.value}%"`};function qt(e){return e===""?[]:Ko(e).map(Vo)}function Ko(e){let t=[],r=0,o="",a=!1,n=!1;for(;r<e.length;){let s=e[r];if((a||n)&&s==="\\"){o+=e[r+1],r+=2;continue}if(s==="'"&&!n){a=!a,o+=s,r++;continue}if(s==='"'&&!a){n=!n,o+=s,r++;continue}if(s===","&&!a&&!n){t.push(o.trim()),o="",r++;continue}o+=s,r++}if(o.trim()!==""&&t.push(o.trim()),a||n)throw new Error("Unterminated string literal");return t}function Vo(e){if(e.startsWith("'")&&e.endsWith("'"))return{value:Lt(e.slice(1,-1),"'")};if(e.startsWith('"')&&e.endsWith('"'))return{value:Lt(e.slice(1,-1),'"')};let t=Number(e);if(!Number.isNaN(t))return{value:t};throw new Error(`Invalid literal: ${e}`)}function Lt(e,t){return e.replace(/\\(.)/g,(r,o)=>o)}var Bt={operator:"IN",parse:e=>{let t=e.match(/^in\s*\((.*)\)$/i);if(t)return qt(t[1])},stringify:e=>`IN (${e?.map(t=>`"${t.value}"`).join(", ")})`},Qt={operator:"NOT IN",parse:e=>{let t=e.match(/^not\s+in\s*\((.*)\)$/i);if(t)return qt(t[1])},stringify:e=>`NOT IN (${e?.map(t=>`"${t.value}"`).join(", ")})`};var Ft={operator:"=",parse:e=>{let t=e.match(/^=\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:(e,t)=>vt(t)?`${e[0]?.value}`:`= ${e[0]?.value}`},Mt={operator:"!=",parse:e=>{let t=e.match(/^!=\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`!= ${e[0]?.value}`},$t={operator:"<>",parse:e=>{let t=e.match(/^<>\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`<> ${e[0]?.value}`},Wt={operator:">",parse:e=>{let t=e.match(/^>\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`> ${e[0]?.value}`},Ht={operator:">=",parse:e=>{let t=e.match(/^>=\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`>= ${e[0]?.value}`},Yt={operator:"<",parse:e=>{let t=e.match(/^<\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`< ${e[0]?.value}`},Gt={operator:"<=",parse:e=>{let t=e.match(/^<=\s*(.*)$/);if(t)return[{value:P(t[1])}]},stringify:e=>`<= ${e[0]?.value}`};var jt={operator:"IS NULL",parse:e=>{if(/^is\s+null$/i.test(e))return[]},stringify:()=>"IS NULL"},Kt={operator:"IS NOT NULL",parse:e=>{if(/^is\s+not\s+null$/i.test(e))return[]},stringify:()=>"IS NOT NULL"};var zo=[xt,Ut,_t,kt,Bt,Qt,Ft,Mt,$t,Ht,Wt,Gt,Yt,jt,Kt];function Jo(e){let t=e.trim();for(let r of zo){let o=r.parse(t);if(o)return{operator:r.operator,value:o}}}var Vt={parse:Jo};var I=e=>{let t=Ue[e];return r=>Ue[r.currentTeamRole]>=t},zt=async e=>{let t=e.routeOptions.config.requireRole;if(t&&!t(e.user))throw new i(403,"You are not authorized to perform this action")};var Jt=async(e,t)=>{await e.createQueryBuilder().delete().from(z).where(`queryId IN (
|
|
58
58
|
SELECT id
|
|
59
59
|
FROM query
|
|
60
60
|
WHERE dataSourceId = :dataSourceId
|
|
61
|
-
)`).setParameter("dataSourceId",t).execute(),await e.delete(K,{dataSource:{id:t}})},ye=async(e,t)=>{let r=await e.find(q,{where:{datasource:{id:t}},select:["id"]});for(let o of r)await e.delete(M,{table:{id:o.id}}),await e.delete(q,o)};function Zo(e){let t=new Map;for(let r of e)r.columns?.forEach(o=>{if(o.ref){let a=`${o.ref.table}.${o.ref.field}`,n=t.get(a)||[];n.push({table:r.tableName,field:o.name}),t.set(a,n)}});return t}var Zt=async e=>{let t=await C.findOne({where:{id:e},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]});if(!t)throw new Error("Data source not found");return t.status="INSPECTING",await C.save(t),b.transaction(async r=>{let a=await(await Pt(k(t,!0),t.dbType)).inspectSchema();await ye(r,t.id);let n=Zo(a);for(let i of a){let s=await r.save(q,{datasource:{id:e},name:i.tableName});if(i.columns){let c=[];for(let m of i.columns)c.push(ce.create({table:{id:s.id},name:m.name,isPrimary:!!m.isPrimary,type:m.type,meta:{refs:m.ref,referencedBy:n.get(`${s.name}.${m.name}`)}}));await r.save(M,c)}}await r.save(F,{id:e,status:"READY",lastInspected:new Date})}).catch(r=>{console.error(r),C.save({id:e,status:"FAILED"})}),!0};var er=h(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=p(t),o=await C.findOne({where:{id:r}});if(!o)throw new u(404,"Data source not found");return{data:o}}}),e.route({method:"get",url:"/",handler:async t=>{let{teamId:r}=_(t);return{data:await C.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",config:{requireRole:I("admin")},handler:async t=>{let{teamId:r,ownerId:o,...a}=f(t,It),n=C.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),i=await $(k(n),n.dbType,t);try{await i.checkConnection()}catch{throw new u(400,"Cannot connect to the database, please check datasource configuration")}let{tag:s,iv:c,encrypted:m}=pe.encrypt(n.dbPassword);return n.dbPassword=m,n.dbPasswordIv=c,n.dbPasswordTag=s,{data:await C.save(n)}}}),e.route({method:"put",url:"/:id",config:{requireRole:I("admin")},handler:async t=>{let{id:r}=p(t),o=f(t),a=await C.findOneBy({id:r});if(!a)throw new u(404,"Data source not found");let n=C.merge(a,o);return await C.save(n),{data:n}}}),e.route({method:"delete",url:"/:id",config:{requireRole:I("admin")},handler:async t=>b.transaction(async r=>{let{id:o}=p(t);await r.delete(z,{dataSource:{id:o}}),await Xt(r,o),await ye(r,o),await r.delete(F,{id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=p(t);return{data:{started:await Zt(o)}}}}),e.route({method:"get",url:"/:id/inspections",handler:async t=>{let{id:r}=p(t);return{data:(await me.find({where:{datasource:{id:r}},relations:{columns:!0},order:{name:"ASC",columns:{isPrimary:"DESC",name:"ASC"}}})).map(n=>({tableName:n.name,id:n.id,updatedAt:n.updatedAt,createdAt:n.createdAt,columns:n.columns.map(i=>({name:i.name,type:i.type,isPrimary:i.isPrimary,ref:i.meta?.refs}))}))}}})});var L=require("typeorm"),tr=h(e=>{e.route({method:"get",url:"/team/:teamId/datasources",handler:async t=>{let{teamId:r}=p(t);return{data:await C.find({where:{team:{id:r}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0,dbType:!0,description:!0,allowInsert:!0,allowUpdate:!0}})}}}),e.route({method:"get",url:"/team/:teamId/queries",handler:async t=>{let r=p(t),o=_(t),a=r.teamId||t.user.currentTeamId,n=Number(o.size)||20,i=Number(o.page)||0,s=o.nameFilter?.length?{name:(0,L.Raw)(y=>`LOWER(${y}) LIKE :search`,{search:`%${o.nameFilter.toLowerCase()}%`})}:void 0,c=await U.find({where:[{isPersonal:!1,team:{id:a},query:s},{isPersonal:!0,team:{id:a},query:s,user:{id:t.user.id}}],relations:{query:{dataSource:!0}},take:n+1,skip:i*n,select:{id:!0,query:{id:!0,name:!0,updatedAt:!0,dataSource:{name:!0,dbType:!0}}},order:{query:{updatedAt:"DESC"}}}),m=c.length>n;return m&&c.pop(),{data:c.map(y=>({name:y.query.name,id:y.query.id,updatedAt:y.query.updatedAt,savedQueryId:y.id,datasourceName:y.query.dataSource.name,datasourceType:y.query.dataSource.dbType})),hasMore:m}}}),e.route({method:"get",url:"/team/:teamId/query",handler:async t=>{let{teamId:r}=p(t),{search:o,size:a,selectedDataSources:n}=_(t),i=o.length>3?parseInt(a)||20:8,s={};n?.length&&(s.id=(0,L.In)(n));let[c,m,l]=await Promise.all([me.find({where:{name:(0,L.Raw)(d=>`LOWER(${d}) LIKE :search`,{search:`%${o.toLowerCase()}%`}),datasource:s},relations:{datasource:!0},select:{id:!0,name:!0,datasource:{name:!0,id:!0}},order:{name:"ASC"},take:i}),S.find({where:{searchString:(0,L.Like)(`%${o.toLowerCase()}%`),team:{id:r},user:{id:t.user.id},dataSource:s},relations:{dataSource:!0},select:{id:!0,name:!0,updatedAt:!0,dataSource:{id:!0,name:!0}},order:{updatedAt:"DESC"},take:i}),U.find({where:{searchString:(0,L.Like)(`%${o.toLowerCase()}%`),team:{id:r},query:{dataSource:s}},relations:{query:{dataSource:!0}},select:{id:!0,updatedAt:!0,query:{id:!0,name:!0,dataSource:{name:!0}}},order:{updatedAt:"DESC"},take:i})]),y=[];return c.forEach(d=>{y.push({name:d.name,id:d.id,dataSourceName:d.datasource?.name||"--",dataSourceId:d.datasource?.id||"--",type:"table"})}),m.forEach(d=>{y.push({name:d.name,id:d.id,dataSourceName:d.dataSource?.name||"--",dataSourceId:d.dataSource?.id||"--",type:"tab"})}),l.forEach(d=>{y.push({name:d.query.name,id:d.query.id,dataSourceName:d.query.dataSource?.name||"--",dataSourceId:d.query.dataSource?.id||"--",type:"query"})}),{data:y}}}),e.route({method:"get",url:"/team/:teamId/tabs-history",handler:async t=>{let{teamId:r}=p(t),o=_(t),a=Number(o.page),n=Number(o.size),i=t.user.id,s={team:{id:r},user:{id:i}};o.nameFilter?.length&&(s.name=(0,L.Like)(`%${o.nameFilter}%`)),o.archived&&(s.archived=o.archived==="true");let c=await S.find({where:s,relations:{dataSource:!0},order:{updatedAt:"DESC"},take:n+1,skip:a*n}),m=!1;return c.length>n&&(c.pop(),m=!0),{data:c.map(l=>({name:l.name,id:l.id,updatedAt:l.updatedAt,archived:l.archived,createdAt:l.createdAt,dataSourceId:l.dataSource?.id,dataSourceName:l.dataSource?.name,dataSourceType:l.dataSource?.dbType})),hasMore:m}}})});var rr=h(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=p(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:"/",config:{requireRole:I("editor")},handler:async t=>{let r=f(t),o=await C.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await N.save(N.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:I("editor")},handler:async t=>{let{id:r}=p(t),o=f(t);if(!(await N.update(r,o)).affected)throw new u(404,"Query not found");return{data:await N.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",config:{requireRole:I("editor")},handler:async t=>b.transaction(async()=>{let{id:r}=p(t);if(!(await N.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var or=e=>e&&fe(e)?"CONTAINS":"=",Le=(e,t)=>{let r=[];for(let o of e){if(!o.column?.length||!o.value?.length||o.isEnabled===!1)continue;let[a,n]=o.column.split("."),i=t(a,n);if(o.mode==="advanced"){let s=zt.parse(o.value);if(!s)throw new u(400,`Invalid value for '${o.column}': ${o.value}`);r.push({value:s.value,column:o.column,operator:s.operator||or(i?.type),fn:o.fn})}else o.mode==="raw"?r.push({value:o.value?[{value:o.value}]:[],column:o.column,operator:"RAW",fn:o.fn}):r.push({value:o.value?[{value:o.value}]:[],column:o.column,operator:or(i?.type),fn:o.fn})}return r},ar=e=>{let t=[e.table];return e.joins&&e.joins.forEach(({table:r})=>t.push(r)),t},ke=e=>({column:e.value,fn:e.fn,distinct:e.distinct}),nr=(e,t,r)=>{let o=[];return t.length>0||r.length>0?o.push(...t.map(ke),...r.map(ke)):e.length>0&&o.push(...e.map(ke)),o},ea=e=>e.isPrimary&&e.table?.name?{table:e.table.name,field:e.name}:e?.meta?.refs,ta=e=>e?.meta?.referencedBy,sr=(e,t,r)=>t.map((o,a)=>{let n=o.table?r(o.table,o.column):void 0,i=n?ea(n):void 0,s=n?ta(n):void 0;return{...o,full:e[a].fn?e[a].column:o.full,type:n?.type,fn:e[a].fn,hidden:e[a].hidden,isPrimary:n?.isPrimary,ref:i,referencedBy:s}}),ir=e=>{let t=[],r=[];for(let o of e)o.referencedBy?.forEach(a=>{t.push({id:[a.table,a.field,o.table,o.column].join("."),fromColumn:a.field,fromTable:a.table,toColumn:o.column,toTable:o.table,direction:"in"})}),o.ref&&(r.push({id:[o.column,o.table,o.ref.table,o.ref.field].join("."),fromColumn:o.column,fromTable:o.table,toColumn:o.ref.field,toTable:o.ref.table,direction:"out"}),o.ref.table!==o.table&&t.push({id:[o.column,o.table,o.ref.table,o.ref.field].join("."),fromColumn:o.column,fromTable:o.table,toColumn:o.ref.field,toTable:o.ref.table,direction:"out"}));return{hooks:t,entities:r}};var qe=require("typeorm"),ur=new qe.DataSource({type:"mysql"}),cr=new qe.DataSource({type:"postgres"}),Y=e=>{switch(e){case"postgres":return cr.createQueryBuilder();case"mysql":return ur.createQueryBuilder();default:throw new Error("Unsupported database connection")}},Te={postgres:cr.driver,mysql:ur.driver};var ee=(e,t,r)=>{let{column:o,operator:a,value:n}=e,i="_"+t;switch(a){case"RAW":let s=" "+o+" ";return[`(${o} ${n[0].value.replace(/\s_\s/g,s)})`,{}];case"IS NULL":case"IS NOT NULL":return[`${o} ${a}`,{value:void 0}];case"IN":case"NOT IN":return[`${o} ${a} (:...${i})`,{[i]:n?.map(l=>l.value)}];case"LIKE":case"CONTAINS":return[`${o} ${r==="postgres"?"ILIKE":"LIKE"} :${i}`,{[i]:a==="CONTAINS"?`%${n?.[0].value}%`:n?.[0].value}];case"NOT LIKE":case"NOT CONTAINS":return[`${o} ${r==="postgres"?"NOT ILIKE":"NOT LIKE"} :${i}`,{[i]:a==="NOT CONTAINS"?`%${n?.[0].value}%`:n?.[0].value}];default:return[`${o} ${a} :${i}`,{[i]:n?.[0]?.value}]}};var mr=e=>{let t=Te[e];return r=>{if(r.includes(".")){let[o,a]=r.split(".");return t.escape(o)+"."+t.escape(a)}return r==="*"?r:t.escape(r)}};var lr=["SUM","COUNT","AVG","MAX","MIN"],ra=["YEAR","MONTH","DAY",...lr],oa=ra.reduce((e,t)=>(e[t]=!0,e),{}),aa=lr.reduce((e,t)=>(e[t]=!0,e),{}),dr=e=>oa[e],pr=e=>aa[e];var ge=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,fr={YEAR:e=>`EXTRACT(YEAR FROM ${e})`,MONTH:e=>`EXTRACT(MONTH FROM ${e})`,DAY:e=>`EXTRACT(DAY FROM ${e})`,SUM:(e,t,r)=>r?`COALESCE(SUM(distinct ${e}), 0)`:`COALESCE(SUM(${e}), 0)`,AVG:ge,MAX:ge,MIN:ge,COUNT:ge};var he=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,yr={YEAR:e=>`YEAR(${e})`,MONTH:e=>`MONTH(${e})`,DAY:e=>`DAY(${e})`,SUM:(e,t,r)=>r?`coalesce(${t}(distinct ${e}), 0)`:`coalesce(${t}(${e}), 0)`,AVG:he,MAX:he,MIN:he,COUNT:he};var na=e=>{let t=[];return e.fn&&t.push(e.fn),e.distinct&&t.push("distinct"),t.push(e.column),t.join(" ")},sa=e=>{let t=mr(e),r=e==="postgres"?fr:yr;return o=>o.fn&&dr(o.fn)?r[o.fn](t(o.column),o.fn,o.distinct):t(o.column)};function Tr(e,t){let r=Y(t.dbType).from(e,e),o=!1,a=0,n=sa(t.dbType),i={};return{setColumns(s){s.forEach(c=>{let m=na(c);i[m]=m,r.addSelect(n(c),m)})},setLimit:s=>{r.limit(s),o=!0},setOffset(s){r.offset(s)},addOrderBy(s,c){r.addOrderBy(s,c)},addJoin({table:s,alias:c,on:m}){r.leftJoin(s,c||s,m)},addWhere(s){let[c,m]=ee({...s,operator:s.operator||"=",column:n(s)},++a,t.dbType);r.andWhere(c,m)},addHaving(s){let[c,m]=ee({...s,operator:s.operator||"=",column:n(s)},++a,t.dbType);r.andHaving(c,m)},addGroupBy(s){r.addGroupBy(n(s))},hasAlias(s){return!!i[s]},build(){o||r.limit(50);let[s,c]=r.getQueryAndParameters();return{sql:s,params:c}}}}var gr=(e,t)=>{let r=Y(t.dbType).update(e),o=0;return{addWhere(a){let[n,i]=ee(a,++o,t.dbType);r.andWhere(n,i)},setParams(a){let n={};for(let[i,s]of Object.entries(a))s.mode==="raw"?n[i]=()=>s.value:n[i]=s.value;r.set(n)},build(){let[a,n]=r.getQueryAndParameters();return{sql:a,params:n}}}};var hr=(e,t)=>{let r=Y(t.dbType).insert().into(e);return{setValues(o){let a={};for(let[n,i]of Object.entries(o))i.mode==="raw"?a[n]=()=>i.value:a[n]=i.value;r.values([a])},build(){let[o,a]=r.getQueryAndParameters();return{sql:o,params:a}}}};var Be=Tr,br=gr,wr=hr;var Sr=require("typeorm"),Ir=async(e,t)=>{let r=await ce.find({where:{table:{name:(0,Sr.In)(t),datasource:{id:e}}},relations:{table:!0},order:{table:{name:"ASC"},isPrimary:"DESC",name:"ASC"}}),o=[];for(let s of r)o.push({column:s.name,table:s.table.name||"",full:`${s.table.name}.${s.name}`,type:s.type});let a=o.reduce((s,c)=>(s[c.full]=c.type,s),{});return{getAllColumns(){return o},hasColumn(s){return!!a[s]||s==="*"},getPrimaryKeyColumns(){return r.filter(s=>s.isPrimary).map(s=>({table:s.table.name,column:s.name,full:`${s.table.name}.${s.name}`}))},getAvailableJoins:()=>{let s=[],c=new Set(t);for(let m of r)if(m.meta?.referencedBy?.forEach(l=>{c.has(l.table)||s.push({id:[l.table,l.field,m.name,m.table.name].join("."),fromColumn:l.field,fromTable:l.table,toColumn:m.name,toTable:m.table.name,direction:"in"})}),m.meta?.refs){let l=m.meta.refs;c.has(l.table)||s.push({id:[m.name,m.table.name,l.table,l.field].join("."),fromColumn:m.name,fromTable:m.table.name,toColumn:l.field,toTable:l.table,direction:"out"})}return s},getColumnByName:(s,c)=>{for(let m of r)if(m.name===c&&m.table.name===s)return m}}};async function ia(e,t,r){return N.save(N.create({user:{id:e},team:{id:t},dataSource:{id:r.datasourceId},name:r.name,opts:r.opts}))}var be=async(e,t)=>{let{datasourceId:r,size:o=20,page:a}=t,{table:n,joins:i,groupBy:s,orderBy:c}=t.opts,m=await we(r);if(!m)throw new u(404,"Datasource not found");let l=nr(t.opts.columns,t.opts.groupBy,t.opts.aggregations),y=ar(t.opts),d=await Ir(r,y),A=d.getAllColumns(),v;l&&l.length>0?v=l:v=A.map(E=>({column:E.full})),v.forEach(E=>{if(!d.hasColumn(E.column))throw new u(400,`Invalid column ${E.column}`)});let so=s&&s.length>0||t.opts.aggregations&&t.opts.aggregations.length>0;if(l&&l.length>0&&!so){let E=new Set(v.map(oe=>oe.column)),Ee=d.getPrimaryKeyColumns();for(let oe of Ee)E.has(oe.full)||v.push({column:oe.full,hidden:!0})}let io=ia(e.user.id,e.user.currentTeamId,t),x=Be(n,m);x.setLimit(o+1),x.setOffset(o*a),x.setColumns(v),i&&i.forEach(x.addJoin),c.length>0&&c.forEach(({column:E,direction:Ee})=>{x.hasAlias(E)&&x.addOrderBy(Te[m.dbType].escape(E),Ee)}),s&&s.length>0&&s.forEach(E=>{d.hasColumn(E.value)&&x.addGroupBy({column:E.value,fn:E.fn,distinct:E.distinct})}),Le(t.opts.filters,d.getColumnByName).forEach(E=>{E.fn&&pr(E.fn)?x.addHaving(E):x.addWhere(E)});let{sql:uo,params:co}=x.build(),re=await(await $(k(m,!0),m.dbType,e)).executeQuery({sql:uo,params:co,type:"SELECT",allowBulkUpdate:!1}),Me=re.rows.length>o;Me&&re.rows.pop();let{id:mo}=await io,$e=sr(v,re.columns,d.getColumnByName),{hooks:lo,entities:po}=ir($e);return{...re,queryHistoryId:mo,tables:y,allColumns:A,availableHooks:lo,availableEntities:po,availableJoins:d.getAvailableJoins(),columns:$e,hasMore:Me}},Er=async(e,t)=>{let r=await we(t.dataSourceId);if(!r)throw new u(400,"Invalid datasource");let o=await $(k(r,!0),r.dbType,e),a=Be(t.table,r);a.setLimit(2);for(let[c,m]of Object.entries(t.props))a.addWhere({value:[{value:m}],column:c});let{sql:n,params:i}=a.build(),s=await o.executeQuery({sql:n,params:i,type:"SELECT",allowBulkUpdate:!1});if(s.rows.length>1)throw new u(400,"Found multiple rows for given query");if(s.rows.length<1)throw new u(404,"Entity not found");return{entity:s.rows[0],columns:s.columns,sql:n}},Cr=async(e,t)=>{let r=await we(t.datasourceId);if(!r)throw new u(404,"Data source not found");if(!r.allowUpdate)throw new u(403,"This datasource does not allow update operations");let o=br(t.table,r);o.setParams(t.values),Le(t.filters,()=>{}).forEach(s=>{o.addWhere(s)});let{sql:a,params:n}=o.build();return(await $(k(r,!0),r.dbType,e)).executeQuery({sql:a,params:n,type:"UPDATE",allowBulkUpdate:!1})},Rr=async(e,t)=>{let r=await we(t.datasourceId);if(!r)throw new u(404,"Data source not found");if(!r.allowInsert)throw new u(403,"This datasource does not allow insert operations");let o=wr(t.table,r);o.setValues(t.values);let{sql:a,params:n}=o.build();return(await $(k(r,!0),r.dbType,e)).executeQuery({sql:a,type:"INSERT",params:n,allowBulkUpdate:!1})};async function we(e){return C.findOne({where:{id:e},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowUpdate","allowInsert"]})}var Nr=e=>{},ua=["--",";","DROP","drop"],Ar=([e,t])=>{t.mode!=="default"&&ua.forEach(r=>{if(t.value.includes(r))throw new u(400,"Invalid input value for "+e)})},Pr=e=>{if(!e.table)throw new u(400,"Table is required");Object.entries(e.values).forEach(Ar)},Or=e=>{if(!e.table)throw new u(400,"Table is required");Object.entries(e.values).forEach(Ar)};var Dr=h(e=>{e.route({method:"post",url:"/:dsId/select",handler:async t=>{let r=f(t,Nr);return{data:await be(t,r)}}}),e.route({method:"get",url:"/:dsId/entity/:table",handler:async t=>{let{dsId:r,table:o}=p(t),a=_(t);return{data:await Er(t,{table:o,dataSourceId:r,props:a})}}}),e.route({method:"post",url:"/:dsId/insert",config:{requireRole:I("editor")},handler:async t=>{let r=f(t,Pr);return{data:await Rr(t,r)}}}),e.route({method:"post",url:"/:dsId/update",config:{requireRole:I("editor")},handler:async t=>{let r=f(t,Or);return{data:await Cr(t,r)}}})});var vr=h(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:T.str("SERVER_VERSION")}}))});var xr=h(e=>{e.route({method:"get",url:"/:id/users",handler:async t=>{let{id:r}=p(t),o=await B.findOne({where:{id:r},relations:{users:{user:!0}}});if(!o)throw new u(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:I("editor")},handler:async t=>b.transaction(async()=>{let r=t.user.id,o=f(t),a=w.create();a.id=r;let n=B.create(o);await B.save(n);let i=R.create({user:a,team:n});return await R.save(i),{data:n}})}),e.route({method:"patch",url:"/:id/user-role",config:{requireRole:I("admin")},handler:async t=>{let{id:r}=p(t),{role:o,userId:a}=f(t,({role:i})=>{if(i==="owner")throw new u(400,"Only one owner is allowed")});if((await R.findOneBy({user:{id:a},team:{id:r}}))?.role==="owner")throw new u(400,"Cannot change owner role");await R.update({user:{id:a},team:{id:r}},{role:o})}}),e.route({method:"delete",url:"/:id",config:{requireRole:I("admin")},handler:async t=>b.transaction(async()=>{let{id:r}=p(t),{userId:o}=_(t);if((await R.findOneBy({user:{id:o},team:{id:r}}))?.role==="owner")throw new u(400,"Cannot delete team owner");await w.update(o,{currentTeam:null}),await R.delete({user:{id:o},team:{id:r}}),await w.delete({id:o})})})});var Qe=O(require("bcryptjs")),te=async e=>{let t=await Qe.default.genSalt(10);return Qe.default.hash(e,t)};var _r=h(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=await w.findOne({where:{id:t.user.id},relations:{currentTeam:{team:!0}}});if(!r)throw new u(404,"User not found");return{data:{id:r.id,teamId:r.currentTeam?.team.id,teamName:r.currentTeam?.team.name,teamRole:r.currentTeam?.role,username:r.username}}}}),e.route({method:"patch",url:"/",handler:async t=>{let r=t.user.id,o=f(t);if(o.password&&(o.password=await te(o.password)),!(await w.update(r,o)).affected)throw new u(404,"User not found");let n=await w.findOne({where:{id:r},relations:{currentTeam:{team:!0}}});return{data:{id:n?.id,teamId:n?.currentTeam?.team.id,teamName:n?.currentTeam?.team.name,teamRole:n?.currentTeam?.role,username:n?.username}}}}),e.route({method:"post",url:"/",config:{requireRole:I("admin")},handler:async t=>b.transaction(async()=>{let r=f(t),o=await te(r.password),a=await w.save(w.create({username:r.username,password:o})),n=await R.save(R.create({role:"read_only",team:{id:r.teamId},user:{id:a.id}}));await w.update(a.id,{currentTeam:{id:n.id}})})})});var Ur=h(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=t.user.id,o=await H.findOneBy({user:{id:r}});return o||(o=await H.save(H.create({user:{id:r}}))),{data:o}}}),e.route({method:"patch",url:"/",handler:async t=>{let{settings:r}=f(t);if(!r.id)throw new u(400,"Settings id is required!");if(!(await H.update(r.id,r)).affected)throw new u(404,"You do not own these settings!");return{data:await H.findOneBy({id:r.id})}}})});function j(e,...t){let r=[...t];if(e.searchAll&&r.push(e.searchAll),e.filters)for(let o of e.filters)o.value&&r.push(o.value);return r.map(o=>o.toLowerCase()).join(",")}var kr=h(e=>{e.route({method:"post",url:"/",config:{requireRole:I("editor")},handler:async t=>{let r=f(t),o=await N.findOne({where:{id:r.queryId}});if(!o)throw new u(400,"Query not found");let a=await U.save(U.create({isPersonal:!1,team:{id:t.user.currentTeamId},user:{id:t.user.id},query:{id:r.queryId},searchString:j(o.opts,r.name)}));return await N.update(r.queryId,{name:r.name}),{data:a}}}),e.route({method:"delete",url:"/:id",config:{requireRole:I("editor")},handler:async t=>{let{id:r}=p(t);if(!(await U.delete({id:r})).affected)return{status:404,data:"Query not found"}}}),e.route({method:"patch",url:"/:id",handler:async t=>await b.transaction(async()=>{let{id:r}=p(t),o=f(t,i=>{if(!i.name)throw new u(400,"Name is required")}),a=await U.findOne({where:{id:r},relations:{query:!0}});if(!a)throw new u(400,"Query not found");let n=j(a.query.opts,o.name);return await Promise.all([U.update({id:r},{searchString:n}),N.update({id:a.query.id},{name:o.name})]),{data:!0}})})});var Lr=e=>{if(!e.queryId&&!(e.opts&&e.name))throw new u(400,"Either queryId or name and opts are required")};var Br=require("typeorm");var Fe=async()=>{let e=await S.maximum("orderIndex");return e!=null?e+1:0};function qr(e,t){return S.find({where:{team:{id:e},user:{id:t},archived:!1},select:["id","name","orderIndex"],order:{orderIndex:"ASC"}})}var Qr=h(e=>{e.route({method:"get",url:"/",handler:async t=>{let{currentTeamId:r,id:o}=t.user;return{data:await qr(r,o)}}}),e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=p(t),{currentTeamId:o,id:a}=t.user,n=await S.findOne({where:{id:r,team:{id:o},user:{id:a}}});if(!n)throw new u(404,"Not Found");return{data:n}}}),e.route({method:"post",url:"/",handler:async t=>{let{opts:r,name:o,queryId:a}=f(t,Lr),n,i,s=o;if(r)i=r.dataSourceId,n=r;else{let l=await N.findOne({where:{id:a},relations:{dataSource:!0}});if(!l)throw new u(404,"Query not Found");i=l.dataSource.id,n={table:l.opts.table,filters:l.opts.filters,joins:l.opts.joins,orderBy:l.opts.orderBy,columns:l.opts.columns,groupBy:l.opts.groupBy,searchAll:l.opts.searchAll,aggregations:l.opts.aggregations,dataSourceId:l.dataSource.id,page:0,size:50},o||(s=l.name)}let c=await Fe();return{data:await S.save(S.create({name:s||new Date().toISOString(),opts:n||{},orderIndex:c,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=f(t),a=await S.findOne({where:{id:r},relations:{user:!0}});if(!a)throw new u(404,"Not found");if(a.user?.id!==t.user.id)throw new u(404,"Not found");return o&&S.update(r,{opts:o||{},searchString:j(o,a.name),updatedAt:new Date}),{data:{result:await be(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=f(t),a=await S.findOne({where:{id:r,user:{id:t.user.id}}});if(!a)throw new u(404,"Not Found");let n=a.searchString;return o.name&&(n=j(a.opts,o.name)),await S.update(r,{...o,searchString:n}),{data:{id:r}}}}),e.route({method:"patch",url:"/:id/archive",handler:async t=>{let{id:r}=p(t),o=f(t),{currentTeamId:a,id:n}=t.user,i=await S.findOne({where:{id:r,user:{id:t.user.id}},select:["id","orderIndex"]});if(!i)throw new u(404,"Not Found");if(o.others||o.all){let c=ca(a,n,i.id,o);await S.update(c,{archived:!0})}else await S.update(r,{archived:!0});return{data:await qr(a,n)}}}),e.route({method:"patch",url:"/:id/restore",handler:async t=>{let{id:r}=p(t),o=await S.findOne({where:{id:r,user:{id:t.user.id}},select:["id","archived"]});if(!o)throw new u(404,"Not Found");if(!o.archived)throw new u(400,"This tab is not archived");let a=await Fe();return await S.update(r,{archived:!1,orderIndex:a}),{data:{id:r}}}}),e.route({method:"delete",url:"/:id",handler:async t=>{let{id:r}=p(t),o=t.user.id;return await S.delete({id:r,user:{id:o}}),{data:!0}}})});function ca(e,t,r,o){let a={archived:!1,team:{id:e},user:{id:t}};return o.others&&(a.id=(0,Br.Not)(r)),a}var $r=require("node:crypto");var Fr=require("node:crypto"),Mr={teamName:"Default Team",username:"admin"},ma=async()=>{let e=await B.findOneBy({});return e||B.save(B.create({name:Mr.teamName}))},Se=async e=>{let t=await R.findOne({where:{role:"owner"},relations:{user:!0}});if(t)return t.user;let r=await ma(),o=await te(e?.password||(0,Fr.randomBytes)(32).toString("hex")),a=await w.save(w.create({username:e?.name||Mr.username,password:o})),n=await R.save(R.create({user:a,team:r,role:"owner"}));return await w.update(a.id,{currentTeam:n}),a};var Ie={setupAccessToken:void 0},Wr=()=>(Ie.setupAccessToken=(0,$r.randomBytes)(32).toString("hex"),Ie.setupAccessToken),la=e=>{if(!Ie.setupAccessToken)throw new u(400,"Setup already performed");if(!e||e!==Ie.setupAccessToken)throw new u(400,"Invalid setup access token")},W=async()=>D.skipAuth?!1:await w.count()<1,Hr=async e=>{la(e.setupAccessToken),await Se({name:e.userName,password:e.userPassword})};var Gr=h(e=>{e.route({method:"get",url:"/client.config.js",handler:(t,r)=>{let o={skipAuth:D.skipAuth,modeName:D.name,usesCustomDb:Ke(),serverVersion:T.str("SERVER_VERSION","--")};return r.type("application/javascript").send(`window.__CLIENT_CONFIG__ = ${JSON.stringify(o)};`)}}),e.route({method:"get",url:"/",handler:async(t,r)=>await W()?r.redirect("/setup"):r.sendFile("index.html")}),e.route({method:"get",url:"/setup",handler:async(t,r)=>await W()?r.sendFile("setup.html"):r.redirect("/")})});var Yr=e=>{if(!e.setupAccessToken)throw new u(400,"Invalid setup access token");if(!e.userPassword||e.userPassword.length<8)throw new u(400,"Password should be at least 8 chars long");if(!e.userName)throw new u(400,"User name is required")};var jr=h(e=>{e.route({method:"post",url:"/",config:{isPublic:!0},handler:async t=>{if(!await W())throw new u(400,"Setup has already been completed");let o=f(t,Yr);return await Hr(o),{data:!0}}})});var da=[[Gr,"/"],[St,"/api/auth"],[er,"/api/data-sources"],[tr,"/api/project"],[rr,"/api/queries"],[Dr,"/api/runner"],[vr,"/api/status"],[xr,"/api/teams"],[_r,"/api/users"],[Ur,"/api/user-settings"],[kr,"/api/saved-queries"],[Qr,"/api/workbench-tabs"],[jr,"/api/setup"]],Kr=e=>{for(let[t,r]of da)e.register(t,{prefix:r}),console.log("Registered "+r)};var pa=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),fa=async()=>R.findOne({where:{role:"owner"},relations:{user:!0,team:!0}}),ya=async e=>{let t=await fa();if(!t)throw new u(401,"User is not part of a team");e.user={id:t.user.id,currentTeamId:t.team.id,currentTeamRole:t.role}},Ta=async e=>{let t=e.headers.authorization;if(!t)throw new u(401,"Missing auth token");let[r,o]=t.split(" "),{userId:a}=await gt(o),n=await w.findOne({where:{id:a},select:{id:!0,currentTeam:{role:!0,team:{id:!0}}},relations:{currentTeam:{team:!0}}});if(!n)throw new u(401,"Unauthorized");e.user={id:a,currentTeamId:n.currentTeam.team.id,currentTeamRole:n.currentTeam.role}},Vr=async e=>{pa(e)||(D.skipAuth?await ya(e):await Ta(e))};var zr=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Jr=e=>{e.addHook("onRequest",Vr),e.addHook("onRequest",Jt),e.addHook("onResponse",zr)};var Xr=e=>{e.setNotFoundHandler((t,r)=>{if(t.raw.url?.startsWith("/api/")){r.code(404).send({error:"API route not found"});return}r.sendFile("index.html")}),e.setErrorHandler((t,r,o)=>{console.error(t),t instanceof u?o.status(t.status).send({error:t.message}):o.status(500).send({error:"Internal Server Error"})})};var Zr=O(require("@fastify/cookie")),eo=O(require("@fastify/cors"));var to=O(require("@fastify/static")),ro=require("node:path"),oo=e=>{e.register(Zr.default,{}),e.register(eo.default,{origin:J.allowedOrigins,methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),e.register(to.default,{root:(0,ro.join)(__dirname,"web")})};(async function(){let t=(0,ao.default)({querystringParser:o=>no.default.parse(o)});if(je(),oo(t),Jr(t),Kr(t),Xr(t),await t.after(),await mt(),t.listen({port:J.port,host:J.host},(o,a)=>{o&&(console.error(o),process.exit(1)),console.log(`Server listening at ${a}`)}),await W()){let o=Wr();console.log(`Setup access token:
|
|
61
|
+
)`).setParameter("dataSourceId",t).execute(),await e.delete(V,{dataSource:{id:t}})},ye=async(e,t)=>{let r=await e.find(q,{where:{datasource:{id:t}},select:["id"]});for(let o of r)await e.delete(M,{table:{id:o.id}}),await e.delete(q,o)};function Xo(e){let t=new Map;for(let r of e)r.columns?.forEach(o=>{if(o.ref){let a=`${o.ref.table}.${o.ref.field}`,n=t.get(a)||[];n.push({table:r.tableName,field:o.name}),t.set(a,n)}});return t}var Xt=async e=>{let t=await E.findOne({where:{id:e},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]});if(!t)throw new Error("Data source not found");return t.status="INSPECTING",await E.save(t),b.transaction(async r=>{let a=await(await At(k(t,!0),t.dbType)).inspectSchema();await ye(r,t.id);let n=Xo(a);for(let s of a){let u=await r.save(q,{datasource:{id:e},name:s.tableName});if(s.columns){let c=[];for(let l of s.columns)c.push(ce.create({table:{id:u.id},name:l.name,isPrimary:!!l.isPrimary,type:l.type,meta:{refs:l.ref,referencedBy:n.get(`${u.name}.${l.name}`)}}));await r.save(M,c)}}await r.save(F,{id:e,status:"READY",lastInspected:new Date})}).catch(r=>{console.error(r),E.save({id:e,status:"FAILED"})}),!0};var Zt=g(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=f(t),o=await E.findOne({where:{id:r}});if(!o)throw new i(404,"Data source not found");return{data:o}}}),e.route({method:"get",url:"/",handler:async t=>{let{teamId:r}=x(t);return{data:await E.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",config:{requireRole:I("admin")},handler:async t=>{let{teamId:r,ownerId:o,...a}=y(t,St),n=E.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),s=await $(k(n),n.dbType,t);try{await s.checkConnection()}catch{throw new i(400,"Cannot connect to the database, please check datasource configuration")}let{tag:u,iv:c,encrypted:l}=pe.encrypt(n.dbPassword);return n.dbPassword=l,n.dbPasswordIv=c,n.dbPasswordTag=u,{data:await E.save(n)}}}),e.route({method:"put",url:"/:id",config:{requireRole:I("admin")},handler:async t=>{let{id:r}=f(t),o=y(t),a=await E.findOneBy({id:r});if(!a)throw new i(404,"Data source not found");let n=E.merge(a,o);return await E.save(n),{data:n}}}),e.route({method:"delete",url:"/:id",config:{requireRole:I("admin")},handler:async t=>b.transaction(async r=>{let{id:o}=f(t);await r.delete(J,{dataSource:{id:o}}),await Jt(r,o),await ye(r,o),await r.delete(F,{id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=f(t);return{data:{started:await Xt(o)}}}}),e.route({method:"get",url:"/:id/inspections",handler:async t=>{let{id:r}=f(t);return{data:(await me.find({where:{datasource:{id:r}},relations:{columns:!0},order:{name:"ASC",columns:{isPrimary:"DESC",name:"ASC"}}})).map(n=>({tableName:n.name,id:n.id,updatedAt:n.updatedAt,createdAt:n.createdAt,columns:n.columns.map(s=>({name:s.name,type:s.type,isPrimary:s.isPrimary,ref:s.meta?.refs}))}))}}})});var L=require("typeorm"),er=g(e=>{e.route({method:"get",url:"/team/:teamId/datasources",handler:async t=>{let{teamId:r}=f(t);return{data:await E.find({where:{team:{id:r}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0,dbType:!0,description:!0,allowInsert:!0,allowUpdate:!0}})}}}),e.route({method:"get",url:"/team/:teamId/queries",handler:async t=>{let r=f(t),o=x(t),a=r.teamId||t.user.currentTeamId,n=Number(o.size)||20,s=Number(o.page)||0,u=o.nameFilter?.length?{name:(0,L.Raw)(d=>`LOWER(${d}) LIKE :search`,{search:`%${o.nameFilter.toLowerCase()}%`})}:void 0,c=await U.find({where:[{isPersonal:!1,team:{id:a},query:u},{isPersonal:!0,team:{id:a},query:u,user:{id:t.user.id}}],relations:{query:{dataSource:!0}},take:n+1,skip:s*n,select:{id:!0,query:{id:!0,name:!0,updatedAt:!0,dataSource:{name:!0,dbType:!0}}},order:{query:{updatedAt:"DESC"}}}),l=c.length>n;return l&&c.pop(),{data:c.map(d=>({name:d.query.name,id:d.query.id,updatedAt:d.query.updatedAt,savedQueryId:d.id,datasourceName:d.query.dataSource.name,datasourceType:d.query.dataSource.dbType})),hasMore:l}}}),e.route({method:"get",url:"/team/:teamId/query",handler:async t=>{let{teamId:r}=f(t),{search:o,size:a,selectedDataSources:n}=x(t),s=o.length>3?parseInt(a)||20:8,u={};n?.length&&(u.id=(0,L.In)(n));let[c,l,m]=await Promise.all([me.find({where:{name:(0,L.Raw)(p=>`LOWER(${p}) LIKE :search`,{search:`%${o.toLowerCase()}%`}),datasource:u},relations:{datasource:!0},select:{id:!0,name:!0,datasource:{name:!0,id:!0}},order:{name:"ASC"},take:s}),S.find({where:{searchString:(0,L.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:"DESC"},take:s}),U.find({where:{searchString:(0,L.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:"DESC"},take:s})]),d=[];return c.forEach(p=>{d.push({name:p.name,id:p.id,dataSourceName:p.datasource?.name||"--",dataSourceId:p.datasource?.id||"--",type:"table"})}),l.forEach(p=>{d.push({name:p.name,id:p.id,dataSourceName:p.dataSource?.name||"--",dataSourceId:p.dataSource?.id||"--",type:"tab"})}),m.forEach(p=>{d.push({name:p.query.name,id:p.query.id,dataSourceName:p.query.dataSource?.name||"--",dataSourceId:p.query.dataSource?.id||"--",type:"query"})}),{data:d}}}),e.route({method:"get",url:"/team/:teamId/tabs-history",handler:async t=>{let{teamId:r}=f(t),o=x(t),a=Number(o.page),n=Number(o.size),s=t.user.id,u={team:{id:r},user:{id:s}};o.nameFilter?.length&&(u.name=(0,L.Like)(`%${o.nameFilter}%`)),o.archived&&(u.archived=o.archived==="true");let c=await S.find({where:u,relations:{dataSource:!0},order:{updatedAt:"DESC"},take:n+1,skip:a*n}),l=!1;return c.length>n&&(c.pop(),l=!0),{data:c.map(m=>({name:m.name,id:m.id,updatedAt:m.updatedAt,archived:m.archived,createdAt:m.createdAt,dataSourceId:m.dataSource?.id,dataSourceName:m.dataSource?.name,dataSourceType:m.dataSource?.dbType})),hasMore:l}}})});var tr=g(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=f(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:"/",config:{requireRole:I("editor")},handler:async t=>{let r=y(t),o=await E.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await N.save(N.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:I("editor")},handler:async t=>{let{id:r}=f(t),o=y(t);if(!(await N.update(r,o)).affected)throw new i(404,"Query not found");return{data:await N.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",config:{requireRole:I("editor")},handler:async t=>b.transaction(async()=>{let{id:r}=f(t);if(!(await N.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var rr=e=>e&&fe(e)?"CONTAINS":"=",ke=(e,t)=>{let r=[];for(let o of e){if(!o.column?.length||!o.value?.length||o.isEnabled===!1)continue;let[a,n]=o.column.split("."),s=t(a,n);if(o.mode==="advanced"){let u=Vt.parse(o.value);if(!u)throw new i(400,`Invalid value for '${o.column}': ${o.value}`);r.push({value:u.value,column:o.column,operator:u.operator||rr(s?.type),fn:o.fn})}else o.mode==="raw"?r.push({value:o.value?[{value:o.value}]:[],column:o.column,operator:"RAW",fn:o.fn}):r.push({value:o.value?[{value:o.value}]:[],column:o.column,operator:rr(s?.type),fn:o.fn})}return r},ar=e=>{let t=[e.table];return e.joins&&e.joins.forEach(({table:r})=>t.push(r)),t},or=e=>({column:e.value,fn:e.fn,distinct:e.distinct}),nr=(e,t)=>{let r=[];return(e.length>0||t.length>0)&&r.push(...e.map(or),...t.map(or)),r},Zo=e=>e.isPrimary&&e.table?.name?{table:e.table.name,field:e.name}:e?.meta?.refs,ea=e=>e?.meta?.referencedBy,sr=(e,t,r)=>t.map((o,a)=>{let n=o.table?r(o.table,o.column):void 0,s=n?Zo(n):void 0,u=n?ea(n):void 0;return{...o,full:e[a].fn?e[a].column:o.full,type:n?.type,fn:e[a].fn,hidden:e[a].hidden,isPrimary:n?.isPrimary,ref:s,referencedBy:u}}),ir=e=>{let t=[],r=[];for(let o of e)o.referencedBy?.forEach(a=>{t.push({id:[a.table,a.field,o.table,o.column].join("."),fromColumn:a.field,fromTable:a.table,toColumn:o.column,toTable:o.table,direction:"in"})}),o.ref&&(r.push({id:[o.column,o.table,o.ref.table,o.ref.field].join("."),fromColumn:o.column,fromTable:o.table,toColumn:o.ref.field,toTable:o.ref.table,direction:"out"}),o.ref.table!==o.table&&t.push({id:[o.column,o.table,o.ref.table,o.ref.field].join("."),fromColumn:o.column,fromTable:o.table,toColumn:o.ref.field,toTable:o.ref.table,direction:"out"}));return{hooks:t,entities:r}};var Le=require("typeorm"),ur=new Le.DataSource({type:"mysql"}),cr=new Le.DataSource({type:"postgres"}),j=e=>{switch(e){case"postgres":return cr.createQueryBuilder();case"mysql":return ur.createQueryBuilder();default:throw new Error("Unsupported database connection")}},Te={postgres:cr.driver,mysql:ur.driver};var te=(e,t,r)=>{let{column:o,operator:a,value:n}=e,s="_"+t;switch(a){case"RAW":let u=" "+o+" ";return[`(${o} ${n[0].value.replace(/\s_\s/g,u)})`,{}];case"IS NULL":case"IS NOT NULL":return[`${o} ${a}`,{value:void 0}];case"IN":case"NOT IN":return[`${o} ${a} (:...${s})`,{[s]:n?.map(m=>m.value)}];case"LIKE":case"CONTAINS":return[`${o} ${r==="postgres"?"ILIKE":"LIKE"} :${s}`,{[s]:a==="CONTAINS"?`%${n?.[0].value}%`:n?.[0].value}];case"NOT LIKE":case"NOT CONTAINS":return[`${o} ${r==="postgres"?"NOT ILIKE":"NOT LIKE"} :${s}`,{[s]:a==="NOT CONTAINS"?`%${n?.[0].value}%`:n?.[0].value}];default:return[`${o} ${a} :${s}`,{[s]:n?.[0]?.value}]}};var mr=e=>{let t=Te[e];return r=>{if(r.includes(".")){let[o,a]=r.split(".");return t.escape(o)+"."+t.escape(a)}return r==="*"?r:t.escape(r)}};var lr=["SUM","COUNT","AVG","MAX","MIN"],ta=["YEAR","MONTH","DAY",...lr],ra=ta.reduce((e,t)=>(e[t]=!0,e),{}),oa=lr.reduce((e,t)=>(e[t]=!0,e),{}),dr=e=>ra[e],pr=e=>oa[e];var he=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,fr={YEAR:e=>`EXTRACT(YEAR FROM ${e})`,MONTH:e=>`EXTRACT(MONTH FROM ${e})`,DAY:e=>`EXTRACT(DAY FROM ${e})`,SUM:(e,t,r)=>r?`COALESCE(SUM(distinct ${e}), 0)`:`COALESCE(SUM(${e}), 0)`,AVG:he,MAX:he,MIN:he,COUNT:he};var ge=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,yr={YEAR:e=>`YEAR(${e})`,MONTH:e=>`MONTH(${e})`,DAY:e=>`DAY(${e})`,SUM:(e,t,r)=>r?`coalesce(${t}(distinct ${e}), 0)`:`coalesce(${t}(${e}), 0)`,AVG:ge,MAX:ge,MIN:ge,COUNT:ge};var aa=e=>{let t=[];return e.fn&&t.push(e.fn),e.distinct&&t.push("distinct"),t.push(e.column),t.join(" ")},na=e=>{let t=mr(e),r=e==="postgres"?fr:yr;return o=>o.fn&&dr(o.fn)?r[o.fn](t(o.column),o.fn,o.distinct):t(o.column)};function Tr(e,t){let r=j(t.dbType).from(e,e),o=!1,a=0,n=na(t.dbType),s={};return{setColumns(u){u.forEach(c=>{let l=aa(c);s[l]=l,r.addSelect(n(c),l)})},setLimit:u=>{r.limit(u),o=!0},setOffset(u){r.offset(u)},addOrderBy(u,c){r.addOrderBy(u,c)},addJoin({table:u,alias:c,on:l}){r.leftJoin(u,c||u,l)},addWhere(u){let[c,l]=te({...u,operator:u.operator||"=",column:n(u)},++a,t.dbType);r.andWhere(c,l)},addHaving(u){let[c,l]=te({...u,operator:u.operator||"=",column:n(u)},++a,t.dbType);r.andHaving(c,l)},addGroupBy(u){r.addGroupBy(n(u))},hasAlias(u){return!!s[u]},build(){o||r.limit(50);let[u,c]=r.getQueryAndParameters();return{sql:u,params:c}}}}var hr=(e,t)=>{let r=j(t.dbType).update(e),o=0;return{addWhere(a){let[n,s]=te(a,++o,t.dbType);r.andWhere(n,s)},setParams(a){let n={};for(let[s,u]of Object.entries(a))u.mode==="raw"?n[s]=()=>u.value:n[s]=u.value;r.set(n)},build(){let[a,n]=r.getQueryAndParameters();return{sql:a,params:n}}}};var gr=(e,t)=>{let r=j(t.dbType).insert().into(e);return{setValues(o){let a={};for(let[n,s]of Object.entries(o))s.mode==="raw"?a[n]=()=>s.value:a[n]=s.value;r.values([a])},build(){let[o,a]=r.getQueryAndParameters();return{sql:o,params:a}}}};var qe=Tr,br=hr,wr=gr;var Sr=require("typeorm"),Ir=async(e,t)=>{let r=await ce.find({where:{table:{name:(0,Sr.In)(t),datasource:{id:e}}},relations:{table:!0},order:{table:{name:"ASC"},isPrimary:"DESC",name:"ASC"}}),o=[],a=[];for(let c of r)o.push({column:c.name,table:c.table.name||"",full:`${c.table.name}.${c.name}`,type:c.type}),(c.isPrimary||c.meta?.refs||c.meta?.referencedBy?.length)&&a.push(`${c.table.name}.${c.name}`);let n=o.reduce((c,l)=>(c[l.full]=l.type,c),{});return{getAllColumns(){return o},getAnchorColumns(){return a},hasColumn(c){return!!n[c]||c==="*"},getPrimaryKeyColumns(){return r.filter(c=>c.isPrimary).map(c=>({table:c.table.name,column:c.name,full:`${c.table.name}.${c.name}`}))},getAvailableJoins:()=>{let c=[],l=new Set(t);for(let m of r)if(m.meta?.referencedBy?.forEach(d=>{l.has(d.table)||c.push({id:[d.table,d.field,m.name,m.table.name].join("."),fromColumn:d.field,fromTable:d.table,toColumn:m.name,toTable:m.table.name,direction:"in"})}),m.meta?.refs){let d=m.meta.refs;l.has(d.table)||c.push({id:[m.name,m.table.name,d.table,d.field].join("."),fromColumn:m.name,fromTable:m.table.name,toColumn:d.field,toTable:d.table,direction:"out"})}return c},getColumnByName:(c,l)=>{for(let m of r)if(m.name===l&&m.table.name===c)return m}}};async function sa(e,t,r){return N.save(N.create({user:{id:e},team:{id:t},dataSource:{id:r.datasourceId},name:r.name,opts:r.opts}))}var be=async(e,t)=>{let{datasourceId:r,size:o=20,page:a}=t,{table:n,joins:s,groupBy:u,orderBy:c}=t.opts,l=await we(r);if(!l)throw new i(404,"Datasource not found");let m=nr(t.opts.groupBy,t.opts.aggregations),d=ar(t.opts),p=await Ir(r,d),A=p.getAllColumns(),_;if(m&&m.length>0){for(let C of m)if(!p.hasColumn(C.column))throw new i(400,`Invalid column ${C.column}`);_=m}else{let C=new Set(t.opts?.hiddenColumns?.map(H=>H.value)),Ee=new Set(p.getAnchorColumns());_=[];for(let H of A)C.has(H.full)?Ee.has(H.full)&&_.push({column:H.full,hidden:!0}):_.push({column:H.full})}let so=sa(e.user.id,e.user.currentTeamId,t),v=qe(n,l);v.setLimit(o+1),v.setOffset(o*a),v.setColumns(_),s&&s.forEach(v.addJoin),c.length>0&&c.forEach(({column:C,direction:Ee})=>{v.hasAlias(C)&&v.addOrderBy(Te[l.dbType].escape(C),Ee)}),u&&u.length>0&&u.forEach(C=>{p.hasColumn(C.value)&&v.addGroupBy({column:C.value,fn:C.fn,distinct:C.distinct})}),ke(t.opts.filters,p.getColumnByName).forEach(C=>{C.fn&&pr(C.fn)?v.addHaving(C):v.addWhere(C)});let{sql:io,params:uo}=v.build(),oe=await(await $(k(l,!0),l.dbType,e)).executeQuery({sql:io,params:uo,type:"SELECT",allowBulkUpdate:!1}),Fe=oe.rows.length>o;Fe&&oe.rows.pop();let{id:co}=await so,Me=sr(_,oe.columns,p.getColumnByName),{hooks:mo,entities:lo}=ir(Me);return{...oe,queryHistoryId:co,tables:d,allColumns:A,availableHooks:mo,availableEntities:lo,availableJoins:p.getAvailableJoins(),columns:Me,hasMore:Fe}},Er=async(e,t)=>{let r=await we(t.dataSourceId);if(!r)throw new i(400,"Invalid datasource");let o=await $(k(r,!0),r.dbType,e),a=qe(t.table,r);a.setLimit(2);for(let[c,l]of Object.entries(t.props))a.addWhere({value:[{value:l}],column:c});let{sql:n,params:s}=a.build(),u=await o.executeQuery({sql:n,params:s,type:"SELECT",allowBulkUpdate:!1});if(u.rows.length>1)throw new i(400,"Found multiple rows for given query");if(u.rows.length<1)throw new i(404,"Entity not found");return{entity:u.rows[0],columns:u.columns,sql:n}},Cr=async(e,t)=>{let r=await we(t.datasourceId);if(!r)throw new i(404,"Data source not found");if(!r.allowUpdate)throw new i(403,"This datasource does not allow update operations");let o=br(t.table,r);o.setParams(t.values),ke(t.filters,()=>{}).forEach(u=>{o.addWhere(u)});let{sql:a,params:n}=o.build();return(await $(k(r,!0),r.dbType,e)).executeQuery({sql:a,params:n,type:"UPDATE",allowBulkUpdate:!1})},Rr=async(e,t)=>{let r=await we(t.datasourceId);if(!r)throw new i(404,"Data source not found");if(!r.allowInsert)throw new i(403,"This datasource does not allow insert operations");let o=wr(t.table,r);o.setValues(t.values);let{sql:a,params:n}=o.build();return(await $(k(r,!0),r.dbType,e)).executeQuery({sql:a,type:"INSERT",params:n,allowBulkUpdate:!1})};async function we(e){return E.findOne({where:{id:e},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowUpdate","allowInsert"]})}var Nr=e=>{},ia=["--",";","DROP","drop"],Ar=([e,t])=>{t.mode!=="default"&&ia.forEach(r=>{if(t.value.includes(r))throw new i(400,"Invalid input value for "+e)})},Pr=e=>{if(!e.table)throw new i(400,"Table is required");Object.entries(e.values).forEach(Ar)},Or=e=>{if(!e.table)throw new i(400,"Table is required");Object.entries(e.values).forEach(Ar)};var Dr=g(e=>{e.route({method:"post",url:"/:dsId/select",handler:async t=>{let r=y(t,Nr);return{data:await be(t,r)}}}),e.route({method:"get",url:"/:dsId/entity/:table",handler:async t=>{let{dsId:r,table:o}=f(t),a=x(t);return{data:await Er(t,{table:o,dataSourceId:r,props:a})}}}),e.route({method:"post",url:"/:dsId/insert",config:{requireRole:I("editor")},handler:async t=>{let r=y(t,Pr);return{data:await Rr(t,r)}}}),e.route({method:"post",url:"/:dsId/update",config:{requireRole:I("editor")},handler:async t=>{let r=y(t,Or);return{data:await Cr(t,r)}}})});var vr=g(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:T.str("SERVER_VERSION")}}))});var xr=g(e=>{e.route({method:"get",url:"/:id/users",handler:async t=>{let{id:r}=f(t),o=await B.findOne({where:{id:r},relations:{users:{user:!0}}});if(!o)throw new i(404,"Team not found");return{data:o.users.map(a=>({role:a.role,id:a.user.id,name:a.user.username}))}}}),e.route({method:"post",url:"/",config:{requireRole:I("editor")},handler:async t=>b.transaction(async()=>{let r=t.user.id,o=y(t),a=w.create();a.id=r;let n=B.create(o);await B.save(n);let s=R.create({user:a,team:n});return await R.save(s),{data:n}})}),e.route({method:"patch",url:"/:id/user-role",config:{requireRole:I("admin")},handler:async t=>{let{id:r}=f(t),{role:o,userId:a}=y(t,({role:s})=>{if(s==="owner")throw new i(400,"Only one owner is allowed")});if((await R.findOneBy({user:{id:a},team:{id:r}}))?.role==="owner")throw new i(400,"Cannot change owner role");await R.update({user:{id:a},team:{id:r}},{role:o})}}),e.route({method:"delete",url:"/:id",config:{requireRole:I("admin")},handler:async t=>b.transaction(async()=>{let{id:r}=f(t),{userId:o}=x(t);if((await R.findOneBy({user:{id:o},team:{id:r}}))?.role==="owner")throw new i(400,"Cannot delete team owner");await w.update(o,{currentTeam:null}),await R.delete({user:{id:o},team:{id:r}}),await w.delete({id:o})})})});var Be=O(require("bcryptjs")),re=async e=>{let t=await Be.default.genSalt(10);return Be.default.hash(e,t)};var _r=g(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=await w.findOne({where:{id:t.user.id},relations:{currentTeam:{team:!0}}});if(!r)throw new i(404,"User not found");return{data:{id:r.id,teamId:r.currentTeam?.team.id,teamName:r.currentTeam?.team.name,teamRole:r.currentTeam?.role,username:r.username}}}}),e.route({method:"patch",url:"/",handler:async t=>{let r=t.user.id,o=y(t);if(o.password&&(o.password=await re(o.password)),!(await w.update(r,o)).affected)throw new i(404,"User not found");let n=await w.findOne({where:{id:r},relations:{currentTeam:{team:!0}}});return{data:{id:n?.id,teamId:n?.currentTeam?.team.id,teamName:n?.currentTeam?.team.name,teamRole:n?.currentTeam?.role,username:n?.username}}}}),e.route({method:"post",url:"/",config:{requireRole:I("admin")},handler:async t=>b.transaction(async()=>{let r=y(t),o=await re(r.password),a=await w.save(w.create({username:r.username,password:o})),n=await R.save(R.create({role:"read_only",team:{id:r.teamId},user:{id:a.id}}));await w.update(a.id,{currentTeam:{id:n.id}})})})});var Ur=g(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=t.user.id,o=await Y.findOneBy({user:{id:r}});return o||(o=await Y.save(Y.create({user:{id:r}}))),{data:o}}}),e.route({method:"patch",url:"/",handler:async t=>{let{settings:r}=y(t);if(!r.id)throw new i(400,"Settings id is required!");if(!(await Y.update(r.id,r)).affected)throw new i(404,"You do not own these settings!");return{data:await Y.findOneBy({id:r.id})}}})});function K(e,...t){let r=[...t];if(e.searchAll&&r.push(e.searchAll),e.filters)for(let o of e.filters)o.value&&r.push(o.value);return r.map(o=>o.toLowerCase()).join(",")}var kr=g(e=>{e.route({method:"post",url:"/",config:{requireRole:I("editor")},handler:async t=>{let r=y(t),o=await N.findOne({where:{id:r.queryId}});if(!o)throw new i(400,"Query not found");let a=await U.save(U.create({isPersonal:!1,team:{id:t.user.currentTeamId},user:{id:t.user.id},query:{id:r.queryId},searchString:K(o.opts,r.name)}));return await N.update(r.queryId,{name:r.name}),{data:a}}}),e.route({method:"delete",url:"/:id",config:{requireRole:I("editor")},handler:async t=>{let{id:r}=f(t);if(!(await U.delete({id:r})).affected)return{status:404,data:"Query not found"}}}),e.route({method:"patch",url:"/:id",handler:async t=>await b.transaction(async()=>{let{id:r}=f(t),o=y(t,s=>{if(!s.name)throw new i(400,"Name is required")}),a=await U.findOne({where:{id:r},relations:{query:!0}});if(!a)throw new i(400,"Query not found");let n=K(a.query.opts,o.name);return await Promise.all([U.update({id:r},{searchString:n}),N.update({id:a.query.id},{name:o.name})]),{data:!0}})})});var Lr=e=>{if(!e.queryId&&!(e.opts&&e.name))throw new i(400,"Either queryId or name and opts are required")};var Br=require("typeorm");var Qe=async()=>{let e=await S.maximum("orderIndex");return e!=null?e+1:0};function qr(e,t){return S.find({where:{team:{id:e},user:{id:t},archived:!1},select:["id","name","orderIndex"],order:{orderIndex:"ASC"}})}var Qr=g(e=>{e.route({method:"get",url:"/",handler:async t=>{let{currentTeamId:r,id:o}=t.user;return{data:await qr(r,o)}}}),e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=f(t),{currentTeamId:o,id:a}=t.user,n=await S.findOne({where:{id:r,team:{id:o},user:{id:a}}});if(!n)throw new i(404,"Not Found");return{data:n}}}),e.route({method:"post",url:"/",handler:async t=>{let{opts:r,name:o,queryId:a}=y(t,Lr),n,s,u=o;if(r)s=r.dataSourceId,n=r;else{let m=await N.findOne({where:{id:a},relations:{dataSource:!0}});if(!m)throw new i(404,"Query not Found");s=m.dataSource.id,n={table:m.opts.table,filters:m.opts.filters,joins:m.opts.joins,orderBy:m.opts.orderBy,hiddenColumns:m.opts.hiddenColumns,groupBy:m.opts.groupBy,searchAll:m.opts.searchAll,aggregations:m.opts.aggregations,dataSourceId:m.dataSource.id,page:0,size:50},o||(u=m.name)}let c=await Qe();return{data:await S.save(S.create({name:u||new Date().toISOString(),opts:n||{},orderIndex:c,dataSource:{id:s},user:{id:t.user.id},team:{id:t.user.currentTeamId}}))}}}),e.route({method:"post",url:"/:id/run",handler:async t=>{let{id:r}=f(t),o=y(t),a=await S.findOne({where:{id:r},relations:{user:!0}});if(!a)throw new i(404,"Not found");if(a.user?.id!==t.user.id)throw new i(404,"Not found");return o&&S.update(r,{opts:o||{},searchString:K(o,a.name),updatedAt:new Date}),{data:{result:await be(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,hiddenColumns:o.hiddenColumns,groupBy:o.groupBy,searchAll:o.searchAll,aggregations:o.aggregations}})}}}}),e.route({method:"patch",url:"/:id",handler:async t=>{let{id:r}=f(t),o=y(t),a=await S.findOne({where:{id:r,user:{id:t.user.id}}});if(!a)throw new i(404,"Not Found");let n=a.searchString;return o.name&&(n=K(a.opts,o.name)),await S.update(r,{...o,searchString:n}),{data:{id:r}}}}),e.route({method:"patch",url:"/:id/archive",handler:async t=>{let{id:r}=f(t),o=y(t),{currentTeamId:a,id:n}=t.user,s=await S.findOne({where:{id:r,user:{id:t.user.id}},select:["id","orderIndex"]});if(!s)throw new i(404,"Not Found");if(o.others||o.all){let c=ua(a,n,s.id,o);await S.update(c,{archived:!0})}else await S.update(r,{archived:!0});return{data:await qr(a,n)}}}),e.route({method:"patch",url:"/:id/restore",handler:async t=>{let{id:r}=f(t),o=await S.findOne({where:{id:r,user:{id:t.user.id}},select:["id","archived"]});if(!o)throw new i(404,"Not Found");if(!o.archived)throw new i(400,"This tab is not archived");let a=await Qe();return await S.update(r,{archived:!1,orderIndex:a}),{data:{id:r}}}}),e.route({method:"delete",url:"/:id",handler:async t=>{let{id:r}=f(t),o=t.user.id;return await S.delete({id:r,user:{id:o}}),{data:!0}}})});function ua(e,t,r,o){let a={archived:!1,team:{id:e},user:{id:t}};return o.others&&(a.id=(0,Br.Not)(r)),a}var $r=require("node:crypto");var Fr=require("node:crypto"),Mr={teamName:"Default Team",username:"admin"},ca=async()=>{let e=await B.findOneBy({});return e||B.save(B.create({name:Mr.teamName}))},Se=async e=>{let t=await R.findOne({where:{role:"owner"},relations:{user:!0}});if(t)return t.user;let r=await ca(),o=await re(e?.password||(0,Fr.randomBytes)(32).toString("hex")),a=await w.save(w.create({username:e?.name||Mr.username,password:o})),n=await R.save(R.create({user:a,team:r,role:"owner"}));return await w.update(a.id,{currentTeam:n}),a};var Ie={setupAccessToken:void 0},Wr=()=>(Ie.setupAccessToken=(0,$r.randomBytes)(32).toString("hex"),Ie.setupAccessToken),ma=e=>{if(!Ie.setupAccessToken)throw new i(400,"Setup already performed");if(!e||e!==Ie.setupAccessToken)throw new i(400,"Invalid setup access token")},W=async()=>D.skipAuth?!1:await w.count()<1,Hr=async e=>{ma(e.setupAccessToken),await Se({name:e.userName,password:e.userPassword})};var Yr=g(e=>{e.route({method:"get",url:"/client.config.js",handler:(t,r)=>{let o={skipAuth:D.skipAuth,modeName:D.name,usesCustomDb:je(),serverVersion:T.str("SERVER_VERSION","--")};return r.type("application/javascript").send(`window.__CLIENT_CONFIG__ = ${JSON.stringify(o)};`)}}),e.route({method:"get",url:"/",handler:async(t,r)=>await W()?r.redirect("/setup"):r.sendFile("index.html")}),e.route({method:"get",url:"/setup",handler:async(t,r)=>await W()?r.sendFile("setup.html"):r.redirect("/")})});var Gr=e=>{if(!e.setupAccessToken)throw new i(400,"Invalid setup access token");if(!e.userPassword||e.userPassword.length<8)throw new i(400,"Password should be at least 8 chars long");if(!e.userName)throw new i(400,"User name is required")};var jr=g(e=>{e.route({method:"post",url:"/",config:{isPublic:!0},handler:async t=>{if(!await W())throw new i(400,"Setup has already been completed");let o=y(t,Gr);return await Hr(o),{data:!0}}})});var la=[[Yr,"/"],[wt,"/api/auth"],[Zt,"/api/data-sources"],[er,"/api/project"],[tr,"/api/queries"],[Dr,"/api/runner"],[vr,"/api/status"],[xr,"/api/teams"],[_r,"/api/users"],[Ur,"/api/user-settings"],[kr,"/api/saved-queries"],[Qr,"/api/workbench-tabs"],[jr,"/api/setup"]],Kr=e=>{for(let[t,r]of la)e.register(t,{prefix:r}),console.log("Registered "+r)};var da=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),pa=async()=>R.findOne({where:{role:"owner"},relations:{user:!0,team:!0}}),fa=async e=>{let t=await pa();if(!t)throw new i(401,"User is not part of a team");e.user={id:t.user.id,currentTeamId:t.team.id,currentTeamRole:t.role}},ya=async e=>{let t=e.headers.authorization;if(!t)throw new i(401,"Missing auth token");let[r,o]=t.split(" "),{userId:a}=await Tt(o),n=await w.findOne({where:{id:a},select:{id:!0,currentTeam:{role:!0,team:{id:!0}}},relations:{currentTeam:{team:!0}}});if(!n)throw new i(401,"Unauthorized");e.user={id:a,currentTeamId:n.currentTeam.team.id,currentTeamRole:n.currentTeam.role}},Vr=async e=>{da(e)||(D.skipAuth?await fa(e):await ya(e))};var zr=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Jr=e=>{e.addHook("onRequest",Vr),e.addHook("onRequest",zt),e.addHook("onResponse",zr)};var Xr=e=>{e.setNotFoundHandler((t,r)=>{if(t.raw.url?.startsWith("/api/")){r.code(404).send({error:"API route not found"});return}r.sendFile("index.html")}),e.setErrorHandler((t,r,o)=>{console.error(t),t instanceof i?o.status(t.status).send({error:t.message}):o.status(500).send({error:"Internal Server Error"})})};var Zr=O(require("@fastify/cookie")),eo=O(require("@fastify/cors"));var to=O(require("@fastify/static")),ro=require("node:path"),oo=e=>{e.register(Zr.default,{}),e.register(eo.default,{origin:X.allowedOrigins,methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),e.register(to.default,{root:(0,ro.join)(__dirname,"web")})};(async function(){let t=(0,ao.default)({querystringParser:o=>no.default.parse(o)});if(Ge(),oo(t),Jr(t),Kr(t),Xr(t),await t.after(),await ct(),t.listen({port:X.port,host:X.host},(o,a)=>{o&&(console.error(o),process.exit(1)),console.log(`Server listening at ${a}`)}),await W()){let o=Wr();console.log(`Setup access token:
|
|
62
62
|
${o}`),console.log("Use the above token to finish the setup process when opening the app for the first time.")}else await Se()})();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import"https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap";@import"https://fonts.googleapis.com/css2?family=Comfortaa:wght@300..700&display=swap";@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-800:oklch(44.4% .177 26.899);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-800:oklch(47.6% .114 61.907);--color-green-50:oklch(98.2% .018 155.826);--color-green-200:oklch(92.5% .084 155.995);--color-green-600:oklch(62.7% .194 149.214);--color-green-800:oklch(44.8% .119 151.328);--color-blue-50:oklch(97% .014 254.604);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-800:oklch(42.4% .199 265.638);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-semibold:600;--radius-md:.375rem;--radius-lg:.5rem;--animate-spin:spin 1s linear infinite;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{._pointer-events-auto_1xa5q_2{pointer-events:auto}._pointer-events-none_1xa5q_2{pointer-events:none}._visible_1xa5q_2{visibility:visible}._sr-only_1xa5q_2{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}._absolute_1xa5q_2{position:absolute}._fixed_1xa5q_2{position:fixed}._relative_1xa5q_2{position:relative}._sticky_1xa5q_2{position:sticky}._top-0_1xa5q_2{top:calc(var(--spacing)*0)}._top-2_1xa5q_2{top:calc(var(--spacing)*2)}._right-2_1xa5q_2{right:calc(var(--spacing)*2)}._z-0_1xa5q_2{z-index:0}._z-1_1xa5q_2{z-index:1}._z-10_1xa5q_2{z-index:10}._z-500_1xa5q_2{z-index:500}._col-span-2_1xa5q_2{grid-column:span 2/span 2}._m-2_1xa5q_2{margin:calc(var(--spacing)*2)}._mx-1_1xa5q_2{margin-inline:calc(var(--spacing)*1)}._mx-2_1xa5q_2{margin-inline:calc(var(--spacing)*2)}._mx-auto_1xa5q_2{margin-inline:auto}._my-1_1xa5q_2{margin-block:calc(var(--spacing)*1)}._my-2_1xa5q_2{margin-block:calc(var(--spacing)*2)}._my-10_1xa5q_2{margin-block:calc(var(--spacing)*10)}._mt-1_1xa5q_2{margin-top:calc(var(--spacing)*1)}._mt-2_1xa5q_2{margin-top:calc(var(--spacing)*2)}._mt-4_1xa5q_2{margin-top:calc(var(--spacing)*4)}._mt-8_1xa5q_2{margin-top:calc(var(--spacing)*8)}._mt-10_1xa5q_2{margin-top:calc(var(--spacing)*10)}._mr-1_1xa5q_2{margin-right:calc(var(--spacing)*1)}._mr-2_1xa5q_2{margin-right:calc(var(--spacing)*2)}._mb-0\.5_1xa5q_2{margin-bottom:calc(var(--spacing)*.5)}._mb-1_1xa5q_2{margin-bottom:calc(var(--spacing)*1)}._mb-2_1xa5q_2{margin-bottom:calc(var(--spacing)*2)}._mb-4_1xa5q_2{margin-bottom:calc(var(--spacing)*4)}._mb-10_1xa5q_2{margin-bottom:calc(var(--spacing)*10)}._ml-1_1xa5q_2{margin-left:calc(var(--spacing)*1)}._block_1xa5q_2{display:block}._flex_1xa5q_2{display:flex}._grid_1xa5q_2{display:grid}._hidden_1xa5q_2{display:none}._inline-block_1xa5q_2{display:inline-block}._table_1xa5q_2{display:table}._h-0\.5_1xa5q_2{height:calc(var(--spacing)*.5)}._h-1_1xa5q_2{height:calc(var(--spacing)*1)}._h-8_1xa5q_2{height:calc(var(--spacing)*8)}._h-screen_1xa5q_2{height:100vh}._max-h-full_1xa5q_2{max-height:100%}._max-h-screen_1xa5q_2{max-height:100vh}._min-h-screen_1xa5q_2{min-height:100vh}._w-full_1xa5q_2{width:100%}._w-md_1xa5q_2{width:var(--container-md)}._max-w-full_1xa5q_2{max-width:100%}._max-w-none_1xa5q_2{max-width:none}._max-w-sm_1xa5q_2{max-width:var(--container-sm)}._max-w-xl_1xa5q_2{max-width:var(--container-xl)}._flex-1_1xa5q_2{flex:1}._rotate-90_1xa5q_2{rotate:90deg}._rotate-180_1xa5q_2{rotate:180deg}._rotate-270_1xa5q_2{rotate:270deg}._transform_1xa5q_2{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}._animate-spin_1xa5q_2{animation:var(--animate-spin)}._cursor-auto\!_1xa5q_2{cursor:auto!important}._cursor-pointer_1xa5q_2{cursor:pointer}._grid-cols-2_1xa5q_2{grid-template-columns:repeat(2,minmax(0,1fr))}._grid-cols-4_1xa5q_2{grid-template-columns:repeat(4,minmax(0,1fr))}._flex-col_1xa5q_2{flex-direction:column}._items-center_1xa5q_2{align-items:center}._justify-between_1xa5q_2{justify-content:space-between}._justify-center_1xa5q_2{justify-content:center}._justify-center\!_1xa5q_2{justify-content:center!important}._justify-end_1xa5q_2{justify-content:flex-end}._gap-1_1xa5q_2{gap:calc(var(--spacing)*1)}._gap-2_1xa5q_2{gap:calc(var(--spacing)*2)}._gap-8_1xa5q_2{gap:calc(var(--spacing)*8)}._justify-self-center_1xa5q_2{justify-self:center}._justify-self-end_1xa5q_2{justify-self:flex-end}._truncate_1xa5q_2{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}._overflow-auto_1xa5q_2{overflow:auto}._overflow-hidden_1xa5q_2{overflow:hidden}._overflow-x-auto_1xa5q_2{overflow-x:auto}._overflow-y-auto_1xa5q_2{overflow-y:auto}._rounded_1xa5q_2{border-radius:.25rem}._rounded-full_1xa5q_2{border-radius:3.40282e38px}._rounded-lg_1xa5q_2{border-radius:var(--radius-lg)}._rounded-md_1xa5q_2{border-radius:var(--radius-md)}._rounded-md\!_1xa5q_2{border-radius:var(--radius-md)!important}._rounded-t-md_1xa5q_2{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}._rounded-b-lg_1xa5q_2{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}._rounded-b-md_1xa5q_2{border-bottom-right-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}._border_1xa5q_2{border-style:var(--tw-border-style);border-width:1px}._border-t_1xa5q_2{border-top-style:var(--tw-border-style);border-top-width:1px}._border-b_1xa5q_2{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}._border-gray-100_1xa5q_2{border-color:var(--color-gray-100)}._border-gray-200_1xa5q_2{border-color:var(--color-gray-200)}._border-red-600_1xa5q_2{border-color:var(--color-red-600)}._border-t-gray-200_1xa5q_2{border-top-color:var(--color-gray-200)}._bg-\(--bg\)_1xa5q_2{background-color:var(--bg)}._bg-\(--bg-sec\)\!_1xa5q_2{background-color:var(--bg-sec)!important}._bg-blue-50_1xa5q_2{background-color:var(--color-blue-50)}._bg-gray-50_1xa5q_2{background-color:var(--color-gray-50)}._bg-gray-100_1xa5q_2{background-color:var(--color-gray-100)}._bg-gray-800_1xa5q_2{background-color:var(--color-gray-800)}._bg-gray-900_1xa5q_2{background-color:var(--color-gray-900)}._bg-green-200_1xa5q_2{background-color:var(--color-green-200)}._bg-red-50_1xa5q_2{background-color:var(--color-red-50)}._bg-white_1xa5q_2{background-color:var(--color-white)}._bg-yellow-200_1xa5q_2{background-color:var(--color-yellow-200)}._fill-blue-600_1xa5q_2{fill:var(--color-blue-600)}._p-0\.5_1xa5q_2{padding:calc(var(--spacing)*.5)}._p-1_1xa5q_2{padding:calc(var(--spacing)*1)}._p-2_1xa5q_2{padding:calc(var(--spacing)*2)}._p-4_1xa5q_2{padding:calc(var(--spacing)*4)}._px-1\.5_1xa5q_2{padding-inline:calc(var(--spacing)*1.5)}._px-2_1xa5q_2{padding-inline:calc(var(--spacing)*2)}._px-4_1xa5q_2{padding-inline:calc(var(--spacing)*4)}._py-0\.5_1xa5q_2{padding-block:calc(var(--spacing)*.5)}._py-1_1xa5q_2{padding-block:calc(var(--spacing)*1)}._py-2_1xa5q_2{padding-block:calc(var(--spacing)*2)}._py-4_1xa5q_2{padding-block:calc(var(--spacing)*4)}._py-10_1xa5q_2{padding-block:calc(var(--spacing)*10)}._pr-2_1xa5q_2{padding-right:calc(var(--spacing)*2)}._pb-24_1xa5q_2{padding-bottom:calc(var(--spacing)*24)}._pl-1_1xa5q_2{padding-left:calc(var(--spacing)*1)}._pl-2_1xa5q_2{padding-left:calc(var(--spacing)*2)}._text-center_1xa5q_2{text-align:center}._text-left_1xa5q_2{text-align:left}._font-mono_1xa5q_2{font-family:var(--font-mono)}._text-3xl_1xa5q_2{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}._text-lg_1xa5q_2{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}._text-sm_1xa5q_2{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}._text-xl_1xa5q_2{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}._text-xs_1xa5q_2{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}._text-xs\!_1xa5q_2{font-size:var(--text-xs)!important;line-height:var(--tw-leading,var(--text-xs--line-height))!important}._font-semibold_1xa5q_2{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}._whitespace-nowrap_1xa5q_2{white-space:nowrap}._text-\(--text-color-primary\)_1xa5q_2{color:var(--text-color-primary)}._text-\(--text-color-secondary\)_1xa5q_2{color:var(--text-color-secondary)}._text-\(--text-color-tertiary\)_1xa5q_2{color:var(--text-color-tertiary)}._text-black\/30_1xa5q_2{color:#0000004d}@supports (color:color-mix(in lab,red,red)){._text-black\/30_1xa5q_2{color:color-mix(in oklab,var(--color-black)30%,transparent)}}._text-blue-600_1xa5q_2{color:var(--color-blue-600)}._text-blue-800_1xa5q_2{color:var(--color-blue-800)}._text-gray-100_1xa5q_2{color:var(--color-gray-100)}._text-gray-200_1xa5q_2{color:var(--color-gray-200)}._text-gray-300_1xa5q_2{color:var(--color-gray-300)}._text-gray-500_1xa5q_2{color:var(--color-gray-500)}._text-gray-600_1xa5q_2{color:var(--color-gray-600)}._text-green-800_1xa5q_2{color:var(--color-green-800)}._text-red-500_1xa5q_2{color:var(--color-red-500)}._text-red-600_1xa5q_2{color:var(--color-red-600)}._text-red-800_1xa5q_2{color:var(--color-red-800)}._text-white_1xa5q_2{color:var(--color-white)}._text-yellow-800_1xa5q_2{color:var(--color-yellow-800)}._capitalize_1xa5q_2{text-transform:capitalize}._italic_1xa5q_2{font-style:italic}._underline_1xa5q_2{text-decoration-line:underline}._opacity-30_1xa5q_2{opacity:.3}._opacity-40_1xa5q_2{opacity:.4}._shadow-md_1xa5q_2{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}._blur_1xa5q_2{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}._filter_1xa5q_2{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}._outline-none_1xa5q_2{--tw-outline-style:none;outline-style:none}@media(hover:hover){._hover\:bg-\(--bg-ter\)_1xa5q_2:hover{background-color:var(--bg-ter)}._hover\:bg-gray-100_1xa5q_2:hover{background-color:var(--color-gray-100)}._hover\:bg-gray-600_1xa5q_2:hover{background-color:var(--color-gray-600)}._hover\:text-blue-600_1xa5q_2:hover{color:var(--color-blue-600)}._hover\:text-green-600_1xa5q_2:hover{color:var(--color-green-600)}}@media(min-width:48rem){._md\:col-span-3_1xa5q_2{grid-column:span 3/span 3}._md\:grid_1xa5q_2{display:grid}._md\:w-2xl_1xa5q_2{width:var(--container-2xl)}._md\:grid-cols-3_1xa5q_2{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(min-width:64rem){._lg\:w-lg_1xa5q_2{width:var(--container-lg)}._lg\:w-sm_1xa5q_2{width:var(--container-sm)}._lg\:flex-row_1xa5q_2{flex-direction:row}._lg\:items-center_1xa5q_2{align-items:center}._lg\:pb-12_1xa5q_2{padding-bottom:calc(var(--spacing)*12)}}@media(prefers-color-scheme:dark){._dark\:text-gray-600_1xa5q_2{color:var(--color-gray-600)}}}._alert_1xa5q_2{padding:calc(var(--spacing)*4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}._info_1xa5q_2{background-color:var(--color-blue-50);color:var(--color-blue-800)}._danger_1xa5q_2{background-color:var(--color-red-50);color:var(--color-red-800)}._success_1xa5q_2{background-color:var(--color-green-50);color:var(--color-green-800)}._warning_1xa5q_2{background-color:var(--color-yellow-50);color:var(--color-yellow-800)}._dark_1xa5q_2{background-color:var(--color-gray-50);color:var(--color-gray-800)}@keyframes _spin_1xa5q_1{to{transform:rotate(360deg)}}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-800:oklch(44.4% .177 26.899);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-800:oklch(47.6% .114 61.907);--color-green-200:oklch(92.5% .084 155.995);--color-green-600:oklch(62.7% .194 149.214);--color-green-800:oklch(44.8% .119 151.328);--color-blue-50:oklch(97% .014 254.604);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-semibold:600;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--animate-spin:spin 1s linear infinite;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--bg:#fff;--bg-sec:#f9f9f9;--bg-ter:#f2f2f2;--bg-quat:#e9e9e9;--text-color-primary:#212121;--text-color-secondary:#6b6b6b;--text-color-tertiary:#a6a6a6}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components{.hotkey{cursor:pointer;border-radius:var(--radius-sm);text-align:center;min-width:26px;max-width:26px;min-height:22px;max-height:22px;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);justify-content:center;align-items:center;display:none}@media(min-width:64rem){.hotkey{display:flex}}.hotkey.secondary{border:1px solid var(--bg-ter);background-color:var(--bg)}.hotkey:not(.secondary){border:1px solid var(--bg-ter);background-color:var(--bg-sec)}.comfortaa{font-family:Comfortaa,sans-serif}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.top-0{top:calc(var(--spacing)*0)}.top-2{top:calc(var(--spacing)*2)}.right-2{right:calc(var(--spacing)*2)}.z-0{z-index:0}.z-1{z-index:1}.z-10{z-index:10}.z-500{z-index:500}.col-span-2{grid-column:span 2/span 2}.m-2{margin:calc(var(--spacing)*2)}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing)*1)}.my-2{margin-block:calc(var(--spacing)*2)}.my-10{margin-block:calc(var(--spacing)*10)}.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);margin-top:1.2em;margin-bottom:1.2em;font-size:1.25em;line-height:1.6}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);font-weight:500;text-decoration:underline}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:decimal}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em;list-style-type:disc}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-counters);font-weight:400}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.25em;font-weight:600}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"“""”""‘""’";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em;font-style:italic;font-weight:500}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:0;margin-bottom:.888889em;font-size:2.25em;font-weight:800;line-height:1.11111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:900}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:2em;margin-bottom:1em;font-size:1.5em;font-weight:700;line-height:1.33333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:800}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.6em;margin-bottom:.6em;font-size:1.25em;font-weight:600;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-weight:700}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em;display:block}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;border-radius:.3125rem;padding-inline-start:.375em;font-family:inherit;font-size:.875em;font-weight:500}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-size:.875em;font-weight:600}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:"`"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);padding-top:.857143em;padding-inline-end:1.14286em;padding-bottom:.857143em;border-radius:.375rem;margin-top:1.71429em;margin-bottom:1.71429em;padding-inline-start:1.14286em;font-size:.875em;font-weight:400;line-height:1.71429;overflow-x:auto}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit;background-color:#0000;border-width:0;border-radius:0;padding:0}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){table-layout:auto;width:100%;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.71429}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);vertical-align:bottom;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em;font-weight:600}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);margin-top:.857143em;font-size:.875em;line-height:1.42857}.prose{--tw-prose-body:oklch(37.3% .034 259.733);--tw-prose-headings:oklch(21% .034 264.665);--tw-prose-lead:oklch(44.6% .03 256.802);--tw-prose-links:oklch(21% .034 264.665);--tw-prose-bold:oklch(21% .034 264.665);--tw-prose-counters:oklch(55.1% .027 264.364);--tw-prose-bullets:oklch(87.2% .01 258.338);--tw-prose-hr:oklch(92.8% .006 264.531);--tw-prose-quotes:oklch(21% .034 264.665);--tw-prose-quote-borders:oklch(92.8% .006 264.531);--tw-prose-captions:oklch(55.1% .027 264.364);--tw-prose-kbd:oklch(21% .034 264.665);--tw-prose-kbd-shadows:oklab(21% -.00316127 -.0338527/.1);--tw-prose-code:oklch(21% .034 264.665);--tw-prose-pre-code:oklch(92.8% .006 264.531);--tw-prose-pre-bg:oklch(27.8% .033 256.848);--tw-prose-th-borders:oklch(87.2% .01 258.338);--tw-prose-td-borders:oklch(92.8% .006 264.531);--tw-prose-invert-body:oklch(87.2% .01 258.338);--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:oklch(70.7% .022 261.325);--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:oklch(70.7% .022 261.325);--tw-prose-invert-bullets:oklch(44.6% .03 256.802);--tw-prose-invert-hr:oklch(37.3% .034 259.733);--tw-prose-invert-quotes:oklch(96.7% .003 264.542);--tw-prose-invert-quote-borders:oklch(37.3% .034 259.733);--tw-prose-invert-captions:oklch(70.7% .022 261.325);--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:#ffffff1a;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:oklch(87.2% .01 258.338);--tw-prose-invert-pre-bg:#00000080;--tw-prose-invert-th-borders:oklch(44.6% .03 256.802);--tw-prose-invert-td-borders:oklch(37.3% .034 259.733);font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)),.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.571429em;padding-inline-end:.571429em;padding-bottom:.571429em;padding-inline-start:.571429em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-8{margin-top:calc(var(--spacing)*8)}.mt-10{margin-top:calc(var(--spacing)*10)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-10{margin-bottom:calc(var(--spacing)*10)}.ml-1{margin-left:calc(var(--spacing)*1)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.table{display:table}.h-0\.5{height:calc(var(--spacing)*.5)}.h-1{height:calc(var(--spacing)*1)}.h-8{height:calc(var(--spacing)*8)}.h-screen{height:100vh}.max-h-full{max-height:100%}.max-h-screen{max-height:100vh}.min-h-screen{min-height:100vh}.w-full{width:100%}.w-md{width:var(--container-md)}.max-w-full{max-width:100%}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.flex-1{flex:1}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.rotate-270{rotate:270deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-auto\!{cursor:auto!important}.cursor-pointer{cursor:pointer}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-center\!{justify-content:center!important}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-8{gap:calc(var(--spacing)*8)}.justify-self-center{justify-self:center}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-md\!{border-radius:var(--radius-md)!important}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.rounded-b-lg{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.rounded-b-md{border-bottom-right-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-red-600{border-color:var(--color-red-600)}.border-t-gray-200{border-top-color:var(--color-gray-200)}.bg-\(--bg\){background-color:var(--bg)}.bg-\(--bg-sec\)\!{background-color:var(--bg-sec)!important}.bg-blue-50{background-color:var(--color-blue-50)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-200{background-color:var(--color-green-200)}.bg-red-50{background-color:var(--color-red-50)}.bg-white{background-color:var(--color-white)}.bg-yellow-200{background-color:var(--color-yellow-200)}.fill-blue-600{fill:var(--color-blue-600)}.p-0\.5{padding:calc(var(--spacing)*.5)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-4{padding:calc(var(--spacing)*4)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-4{padding-inline:calc(var(--spacing)*4)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-4{padding-block:calc(var(--spacing)*4)}.py-10{padding-block:calc(var(--spacing)*10)}.pr-2{padding-right:calc(var(--spacing)*2)}.pb-24{padding-bottom:calc(var(--spacing)*24)}.pl-1{padding-left:calc(var(--spacing)*1)}.pl-2{padding-left:calc(var(--spacing)*2)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-xs\!{font-size:var(--text-xs)!important;line-height:var(--tw-leading,var(--text-xs--line-height))!important}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.whitespace-nowrap{white-space:nowrap}.text-\(--text-color-primary\){color:var(--text-color-primary)}.text-\(--text-color-secondary\){color:var(--text-color-secondary)}.text-\(--text-color-tertiary\){color:var(--text-color-tertiary)}.text-black\/30{color:#0000004d}@supports (color:color-mix(in lab,red,red)){.text-black\/30{color:color-mix(in oklab,var(--color-black)30%,transparent)}}.text-blue-600{color:var(--color-blue-600)}.text-blue-800{color:var(--color-blue-800)}.text-gray-100{color:var(--color-gray-100)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-green-800{color:var(--color-green-800)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-800{color:var(--color-red-800)}.text-white{color:var(--color-white)}.text-yellow-800{color:var(--color-yellow-800)}.capitalize{text-transform:capitalize}.italic{font-style:italic}.underline{text-decoration-line:underline}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.outline-none{--tw-outline-style:none;outline-style:none}@media(hover:hover){.hover\:bg-\(--bg-ter\):hover{background-color:var(--bg-ter)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.hover\:text-blue-600:hover{color:var(--color-blue-600)}.hover\:text-green-600:hover{color:var(--color-green-600)}}@media(min-width:48rem){.md\:col-span-3{grid-column:span 3/span 3}.md\:grid{display:grid}.md\:w-2xl{width:var(--container-2xl)}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(min-width:64rem){.lg\:w-lg{width:var(--container-lg)}.lg\:w-sm{width:var(--container-sm)}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:pb-12{padding-bottom:calc(var(--spacing)*12)}}@media(prefers-color-scheme:dark){.dark\:text-gray-600{color:var(--color-gray-600)}}.no-scrollbar::-webkit-scrollbar{display:none}.no-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.scrollbar::-webkit-scrollbar{border-radius:10pt;width:5px}.scrollbar::-webkit-scrollbar-track{background-color:var(--color-gray-100);border-radius:10px}.scrollbar::-webkit-scrollbar-thumb{background-color:var(--color-gray-300);border-radius:10px}.scrollbar::-webkit-scrollbar-thumb:hover{background-color:var(--color-gray-400)}}.page-container{max-width:100%;padding:calc(var(--spacing)*4)}.page-content{width:100%;max-width:1024px;padding-bottom:calc(var(--spacing)*12);flex-direction:column;margin-left:auto;margin-right:auto;display:flex}@media(min-width:64rem){.page-content{padding-bottom:calc(var(--spacing)*0)}}.hr-slide{cursor:col-resize;-webkit-user-select:none;user-select:none;z-index:1;width:8px;height:100%;position:absolute;right:-4px}@media(hover:hover){.hr-slide:hover{background-color:var(--color-blue-200)}}.hl-slide{cursor:col-resize;-webkit-user-select:none;user-select:none;z-index:1;width:8px;height:100%;position:absolute;left:-4px}@media(hover:hover){.hl-slide:hover{background-color:var(--color-blue-200)}}.vb-slide{cursor:row-resize;-webkit-user-select:none;user-select:none;z-index:1;width:100%;height:8px;position:absolute;bottom:-4px}@media(hover:hover){.vb-slide:hover{background-color:var(--color-blue-200)}}.vt-slide{cursor:row-resize;-webkit-user-select:none;user-select:none;z-index:1;width:100%;height:8px;position:absolute;top:-4px}@media(hover:hover){.vt-slide:hover{background-color:var(--color-blue-200)}}.input{border:1px solid var(--bg-quat);background-color:var(--color-white);padding:calc(var(--spacing)*1);outline-style:var(--tw-outline-style);border-radius:.25rem;outline-width:0}.input:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--color-blue-400);--tw-ring-inset:inset}.input:disabled{cursor:not-allowed;background-color:var(--bg-ter)}.form{gap:calc(var(--spacing)*2);background-color:var(--color-white);flex-direction:column;display:flex}.form.shadow{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.form.padding{padding:calc(var(--spacing)*4)}.button{cursor:pointer;border-radius:var(--radius-md);padding-inline:calc(var(--spacing)*2);padding-block:calc(var(--spacing)*.5);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.button:disabled{opacity:.6;cursor:not-allowed}.button.primary{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-blue-600);background-color:var(--color-blue-600);color:var(--color-white)}.button.primary:hover:not(:disabled){border-color:var(--color-blue-700);background-color:var(--color-blue-700)}.button.secondary{background-color:var(--color-gray-300);color:var(--color-gray-800)}.button.tertiary{border:1px solid var(--bg-quat);background-color:var(--color-white);color:var(--color-gray-700)}.button.tertiary:hover{background-color:var(--bg-sec)}.button.danger{color:#fff;background-color:#dc3545}.button.danger:hover{background-color:#bf2e3c}.page-head{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.roboto{font-family:Roboto,sans-serif}.context-menu-container{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-gray-200);background-color:var(--color-white);min-width:150px;max-width:400px;max-height:400px;padding:calc(var(--spacing)*2);--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);overflow:hidden}.context-menu-item{cursor:pointer;border-radius:var(--radius-lg);text-align:left;text-overflow:ellipsis;white-space:nowrap;width:100%;padding:2px 4px;font-size:15px;display:block;overflow:hidden}@media(hover:hover){.context-menu-item:hover{background-color:var(--color-gray-100)}}.a{color:var(--color-blue-400);text-decoration-line:underline}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@keyframes spin{to{transform:rotate(360deg)}}
|