@dataramen/cli 0.0.72 → 0.0.73
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/migrations/1754425464078-InitialMigration.js +1 -1
- package/dist/code/migrations/1755358316764-usersManagement.js +1 -1
- package/dist/code/migrations/1758316062697-queriesHistory.js +1 -1
- package/dist/code/migrations/1760816916693-workbenchTabs.js +1 -1
- package/dist/code/migrations/1762376647080-link-tab-to-datasource.js +1 -1
- package/dist/code/server.js +2 -2
- package/dist/package.json +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var u=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var p=(s,e)=>{for(var n in e)u(s,n,{get:e[n],enumerable:!0})},b=(s,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let m of c(e))!T.call(s,m)&&m!==n&&u(s,m,{get:()=>e[m],enumerable:!(o=i(e,m))||o.enumerable});return s};var N=s=>b(u({},"__esModule",{value:!0}),s);var f={};p(f,{InitialMigration1754425464078:()=>d});module.exports=N(f);var a=require("typeorm");var t=process.env.APP_DB_TYPE==="sqlite"?"datetime":"timestamp";var l=(s={})=>{let e=process.env.APP_DB_TYPE==="mysql";return{name:"id",type:e?"char":"uuid",length:e?"36":void 0,isPrimary:!0,...s}},r=(s,e={})=>{let n=process.env.APP_DB_TYPE==="mysql";return{name:s,type:n?"char":"uuid",length:n?"36":void 0,...e}};var d=class{name="InitialMigration1754425464078";async up(e){await e.createTable(new a.Table({name:"teams",columns:[l(),{name:"name",type:"varchar",isNullable:!1},{name:"createdAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"updatedAt",type:t,default:"CURRENT_TIMESTAMP"}]})),await e.createTable(new a.Table({name:"users",columns:[l(),{name:"createdAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"updatedAt",type:t,default:"CURRENT_TIMESTAMP"},r("currentTeamId",{isNullable:!0})]})),await e.createTable(new a.Table({name:"users_to_teams",columns:[l(),{name:"role",type:"varchar",isNullable:!1,default:"'admin'"},r("teamId",{isNullable:!0}),r("userId",{isNullable:!0})]})),await e.createTable(new a.Table({name:"user_settings",columns:[l(),{name:"createdAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"updatedAt",type:t,default:"CURRENT_TIMESTAMP"},r("userId",{isUnique:!0})]})),await e.createTable(new a.Table({name:"data_sources",columns:[l(),{name:"dbUrl",type:"varchar"},{name:"dbPort",type:"int",isNullable:!0},{name:"dbUser",type:"varchar"},{name:"dbPassword",type:"varchar",isNullable:!0},{name:"dbPasswordIv",type:"varchar",isNullable:!0},{name:"dbPasswordTag",type:"varchar",isNullable:!0},{name:"dbType",type:"varchar"},{name:"createdAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"updatedAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"name",type:"varchar"},{name:"description",type:"varchar",isNullable:!0},{name:"dbDatabase",type:"varchar"},{name:"dbSchema",type:"varchar",isNullable:!0},{name:"allowInsert",type:"boolean",default:!1},{name:"allowUpdate",type:"boolean",default:!1},{name:"lastInspected",type:t,isNullable:!0},{name:"status",type:"varchar",isNullable:!0},r("teamId",{isNullable:!0}),r("ownerId",{isNullable:!0})]})),await e.createTable(new a.Table({name:"query",columns:[l(),{name:"name",type:"varchar"},{name:"opts",type:"json",isNullable:!1},{name:"isTrash",type:"boolean",isNullable:!0,default:!1},{name:"createdAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"updatedAt",type:t,default:"CURRENT_TIMESTAMP"},r("teamId",{isNullable:!0}),r("dataSourceId",{isNullable:!0})]})),await e.createTable(new a.Table({name:"db_inspection",columns:[l(),{name:"tableName",type:"varchar",isNullable:!0},{name:"columns",type:"json",isNullable:!0},{name:"createdAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"updatedAt",type:t,default:"CURRENT_TIMESTAMP"},r("dataSourceId",{isNullable:!0})]})),await e.createForeignKey("users",new a.TableForeignKey({columnNames:["currentTeamId"],referencedTableName:"users_to_teams",referencedColumnNames:["id"]})),await e.createForeignKeys("users_to_teams",[new a.TableForeignKey({columnNames:["teamId"],referencedTableName:"teams",referencedColumnNames:["id"]}),new a.TableForeignKey({columnNames:["userId"],referencedTableName:"users",referencedColumnNames:["id"]})]),await e.createForeignKey("user_settings",new a.TableForeignKey({columnNames:["userId"],referencedTableName:"users",referencedColumnNames:["id"]})),await e.createForeignKeys("data_sources",[new a.TableForeignKey({columnNames:["teamId"],referencedTableName:"teams",referencedColumnNames:["id"]}),new a.TableForeignKey({columnNames:["ownerId"],referencedTableName:"users",referencedColumnNames:["id"]})]),await e.createForeignKeys("query",[new a.TableForeignKey({columnNames:["teamId"],referencedTableName:"teams",referencedColumnNames:["id"]}),new a.TableForeignKey({columnNames:["dataSourceId"],referencedTableName:"data_sources",referencedColumnNames:["id"]})]),await e.createForeignKey("db_inspection",new a.TableForeignKey({columnNames:["datasourceId"],referencedTableName:"data_sources",referencedColumnNames:["id"]}))}async down(e){await e.dropTable("db_inspection",!0),await e.dropTable("query",!0),await e.dropTable("data_sources",!0),await e.dropTable("user_settings",!0),await e.dropTable("users_to_teams",!0),await e.dropTable("users",!0),await e.dropTable("teams",!0)}};0&&(module.exports={InitialMigration1754425464078});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var t=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var c=(s,e)=>{for(var r in e)t(s,r,{get:e[r],enumerable:!0})},d=(s,e,r,u)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of l(e))!p.call(s,n)&&n!==r&&t(s,n,{get:()=>e[n],enumerable:!(u=m(e,n))||u.enumerable});return s};var T=s=>d(t({},"__esModule",{value:!0}),s);var b={};c(b,{UsersManagement1755358316764:()=>i});module.exports=T(b);var o=require("typeorm");var P=process.env.APP_DB_TYPE==="sqlite"?"datetime":"timestamp",a={WorkbenchTabs:"workbench_tabs",Teams:"teams",Users:"users",UsersToTeams:"users_to_teams",UserSettings:"user_settings",DataSources:"data_sources",Query:"query",DbInspection:"db_inspection",SavedQueries:"saved_queries"};var i=class{name="UsersManagement1755358316764";async up(e){await e.addColumns(a.Users,[new o.TableColumn({name:"username",type:"varchar",isUnique:!0}),new o.TableColumn({name:"password",type:"varchar"})])}async down(e){await e.dropColumns(a.Users,["username","password"])}};0&&(module.exports={UsersManagement1755358316764});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var o=Object.defineProperty;var c=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var p=(r,e)=>{for(var n in e)o(r,n,{get:e[n],enumerable:!0})},N=(r,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let m of T(e))!b.call(r,m)&&m!==n&&o(r,m,{get:()=>e[m],enumerable:!(i=c(e,m))||i.enumerable});return r};var f=r=>N(o({},"__esModule",{value:!0}),r);var y={};p(y,{QueriesHistory1758316062697:()=>u});module.exports=f(y);var s=require("typeorm");var t=process.env.APP_DB_TYPE==="sqlite"?"datetime":"timestamp",a={WorkbenchTabs:"workbench_tabs",Teams:"teams",Users:"users",UsersToTeams:"users_to_teams",UserSettings:"user_settings",DataSources:"data_sources",Query:"query",DbInspection:"db_inspection",SavedQueries:"saved_queries"},d=(r={})=>{let e=process.env.APP_DB_TYPE==="mysql";return{name:"id",type:e?"char":"uuid",length:e?"36":void 0,isPrimary:!0,...r}},l=(r,e={})=>{let n=process.env.APP_DB_TYPE==="mysql";return{name:r,type:n?"char":"uuid",length:n?"36":void 0,...e}};var u=class{name="QueriesHistory1758316062697";async up(e){await e.createTable(new s.Table({name:a.SavedQueries,columns:[d(),{name:"isPersonal",type:"boolean"},{name:"createdAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"updatedAt",type:t,default:"CURRENT_TIMESTAMP"},l("teamId",{isNullable:!0}),l("queryId",{isNullable:!1}),l("userId",{isNullable:!1})]})),await e.createForeignKeys(a.SavedQueries,[new s.TableForeignKey({columnNames:["teamId"],referencedTableName:a.Teams,referencedColumnNames:["id"]}),new s.TableForeignKey({columnNames:["userId"],referencedTableName:a.Users,referencedColumnNames:["id"]}),new s.TableForeignKey({columnNames:["queryId"],referencedTableName:a.Query,referencedColumnNames:["id"]})]),await e.addColumns(a.Query,[new s.TableColumn(l("userId",{isNullable:!0}))]),await e.createForeignKeys(a.Query,[new s.TableForeignKey({columnNames:["userId"],referencedTableName:a.Users,referencedColumnNames:["id"]})])}async down(e){await e.dropForeignKeys(a.Query,[new s.TableForeignKey({columnNames:["userId"],referencedTableName:a.Users,referencedColumnNames:["id"]})]),await e.dropColumns(a.Query,["userId"]),await e.dropForeignKeys(a.SavedQueries,[new s.TableForeignKey({columnNames:["teamId"],referencedTableName:a.Teams,referencedColumnNames:["id"]}),new s.TableForeignKey({columnNames:["userId"],referencedTableName:a.Users,referencedColumnNames:["id"]}),new s.TableForeignKey({columnNames:["queryId"],referencedTableName:a.Query,referencedColumnNames:["id"]})]),await e.dropTable("saved_queries",!0)}};0&&(module.exports={QueriesHistory1758316062697});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var m=Object.defineProperty;var
|
|
1
|
+
"use strict";var m=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var p=(a,e)=>{for(var r in e)m(a,r,{get:e[r],enumerable:!0})},f=(a,e,r,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let l of T(e))!b.call(a,l)&&l!==r&&m(a,l,{get:()=>e[l],enumerable:!(i=d(e,l))||i.enumerable});return a};var N=a=>f(m({},"__esModule",{value:!0}),a);var y={};p(y,{WorkbenchTabs1760816916693:()=>u});module.exports=N(y);var n=require("typeorm");var o=process.env.APP_DB_TYPE==="sqlite"?"datetime":"timestamp",s={WorkbenchTabs:"workbench_tabs",Teams:"teams",Users:"users",UsersToTeams:"users_to_teams",UserSettings:"user_settings",DataSources:"data_sources",Query:"query",DbInspection:"db_inspection",SavedQueries:"saved_queries"},c=(a={})=>{let e=process.env.APP_DB_TYPE==="mysql";return{name:"id",type:e?"char":"uuid",length:e?"36":void 0,isPrimary:!0,...a}},t=(a,e={})=>{let r=process.env.APP_DB_TYPE==="mysql";return{name:a,type:r?"char":"uuid",length:r?"36":void 0,...e}};var u=class{name="WorkbenchTabs1760816916693";async up(e){await e.createTable(new n.Table({name:s.WorkbenchTabs,columns:[c(),{name:"createdAt",type:o,default:"CURRENT_TIMESTAMP"},{name:"updatedAt",type:o,default:"CURRENT_TIMESTAMP"},{name:"name",type:"varchar"},{name:"archived",type:"boolean",isNullable:!1,default:!1},{name:"opts",type:"json",isNullable:!1},t("teamId",{isNullable:!1}),t("queryId",{isNullable:!0}),t("userId",{isNullable:!1})]})),await e.createForeignKeys(s.WorkbenchTabs,[new n.TableForeignKey({columnNames:["teamId"],referencedTableName:s.Teams,referencedColumnNames:["id"]}),new n.TableForeignKey({columnNames:["userId"],referencedTableName:s.Users,referencedColumnNames:["id"]}),new n.TableForeignKey({columnNames:["queryId"],referencedTableName:s.Query,referencedColumnNames:["id"]})])}async down(e){await e.dropForeignKeys(s.WorkbenchTabs,[new n.TableForeignKey({columnNames:["teamId"],referencedTableName:s.Teams,referencedColumnNames:["id"]}),new n.TableForeignKey({columnNames:["userId"],referencedTableName:s.Users,referencedColumnNames:["id"]}),new n.TableForeignKey({columnNames:["queryId"],referencedTableName:s.Query,referencedColumnNames:["id"]})]),await e.dropTable(s.WorkbenchTabs,!0)}};0&&(module.exports={WorkbenchTabs1760816916693});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var i=Object.defineProperty;var
|
|
1
|
+
"use strict";var i=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var C=(s,e)=>{for(var n in e)i(s,n,{get:e[n],enumerable:!0})},P=(s,e,n,l)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of b(e))!T.call(s,o)&&o!==n&&i(s,o,{get:()=>e[o],enumerable:!(l=p(e,o))||l.enumerable});return s};var _=s=>P(i({},"__esModule",{value:!0}),s);var y={};C(y,{LinkTabToDatasource1762376647080:()=>u});module.exports=_(y);var r=require("typeorm");var S=process.env.APP_DB_TYPE==="sqlite"?"datetime":"timestamp",a={WorkbenchTabs:"workbench_tabs",Teams:"teams",Users:"users",UsersToTeams:"users_to_teams",UserSettings:"user_settings",DataSources:"data_sources",Query:"query",DbInspection:"db_inspection",SavedQueries:"saved_queries"};var c=(s,e={})=>{let n=process.env.APP_DB_TYPE==="mysql";return{name:s,type:n?"char":"uuid",length:n?"36":void 0,...e}};var m=new r.TableForeignKey({columnNames:["dataSourceId"],referencedTableName:a.DataSources,referencedColumnNames:["id"]}),d=new r.TableColumn(c("dataSourceId",{isNullable:!0})),t=new r.TableColumn({name:"searchString",type:"varchar",isNullable:!0}),u=class{name="LinkTabToDatasource1762376647080";async up(e){await e.addColumns(a.WorkbenchTabs,[d,t]),await e.addColumns(a.SavedQueries,[t]),await e.createForeignKeys(a.WorkbenchTabs,[m])}async down(e){await e.dropForeignKeys(a.WorkbenchTabs,[m]),await e.dropColumns(a.WorkbenchTabs,[d,t]),await e.dropColumns(a.SavedQueries,[t])}};0&&(module.exports={LinkTabToDatasource1762376647080});
|
package/dist/code/server.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var Vr=Object.create;var Ue=Object.defineProperty;var zr=Object.getOwnPropertyDescriptor;var Jr=Object.getOwnPropertyNames;var Xr=Object.getPrototypeOf,Zr=Object.prototype.hasOwnProperty;var eo=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of Jr(t))!Zr.call(e,a)&&a!==r&&Ue(e,a,{get:()=>t[a],enumerable:!(o=zr(t,a))||o.enumerable});return e};var P=(e,t,r)=>(r=e!=null?Vr(Xr(e)):{},eo(t||!e||!e.__esModule?Ue(r,"default",{value:e,enumerable:!0}):r,e));var ee=require("dotenv"),te=require("node:path"),qe=require("node:fs");var X=e=>{function t(a,n=void 0){return e[a]||n}function r(a,n=void 0){let s=e[a];if(!s)return n;let u=Number(s);return!isNaN(u)&&s.trim()!==""?u:n}function o(a){return e[a]==="true"||e[a]==="TRUE"||e[a]==="1"}return{str:t,num:r,bool:o}};function to(e){let t={mode:void 0,env:void 0};for(let r of e){if(!r.startsWith("--"))continue;let[o,...a]=r.slice(2).split("=");if(!o||a.length===0)continue;let n=a.join("=");n=n.replace(/^["'](.+)["']$/,"$1"),t[o]=n}return t}var Z=X(to(process.argv.slice(2)));var ro=(()=>{try{let e=(0,qe.readFileSync)((0,te.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})(),ke=[],Le=Z.str("env");Le&&ke.push((0,te.resolve)(Le));(0,ee.config)({path:ke});var fe={APP_DB_TYPE:"sqlite",APP_DB_DATABASE:"<home>/.dataramen/.runtime/db.sqlite3"};(0,ee.populate)(process.env,{SERVER_VERSION:ro.version,PROD:"true",...fe},{override:!1});var oo=["SYMM_ENCRYPTION_KEY","JWT_SECRET","JWT_REFRESH_SECRET"],Me=()=>{let e=[];for(let t of oo)process.env[t]||e.push(t);if(e.length>0)throw new Error("Following env variables are required but not provided: "+e.join(", "))},T=X(process.env),Qe=()=>T.str("APP_DB_TYPE")!==fe.APP_DB_TYPE&&T.str("APP_DB_DATABASE")!==fe.APP_DB_DATABASE;var Gc=require("reflect-metadata"),$r=P(require("fastify")),Wr=P(require("qs"));var Ve=require("typeorm");var Fe=require("typeorm");var ao={default:{bindServerUrl:"0.0.0.0",skipAuth:!1,name:"default"},docker:{bindServerUrl:"0.0.0.0",skipAuth:!1,name:"docker"},cli:{bindServerUrl:"127.0.0.1",skipAuth:!0,name:"cli"},dev:{bindServerUrl:"127.0.0.1",skipAuth:!0,name:"dev"}},no=Z.str("mode","default"),D=ao[no];var h=T.str("APP_DB_TYPE")==="sqlite"?"datetime":"timestamp",re=D.name==="docker"?e=>e==="localhost"||e==="127.0.0.1"?"host.docker.internal":e:e=>e;var ye=new Fe.EntitySchema({name:"DatabaseInspection",tableName:"db_inspection",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},tableName:{nullable:!0,type:String},columns:{type:"json",nullable:!0},createdAt:{type:h,createDate:!0},updatedAt:{type:h,updateDate:!0}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var Be=require("typeorm");var Te=new Be.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 $e=require("typeorm");var ge=new $e.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 We=require("typeorm");var he=new We.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 He=require("typeorm");var we=new He.EntitySchema({name:"DataSource",tableName:"data_sources",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},dbUrl:{type:String},dbPort:{type:Number,nullable:!0},dbUser:{type:String},dbPassword:{type:String,nullable:!0,select:!1},dbPasswordIv:{type:String,nullable:!0,select:!1},dbPasswordTag:{type:String,nullable:!0,select:!1},dbType:{type:String},createdAt:{type: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},inspections:{type:"one-to-many",target:()=>"DatabaseInspection",inverseSide:"datasource"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"dataSource"},owner:{type:"many-to-one",target:()=>"User",joinColumn:!0}}});var ze=P(require("node:os")),Je=require("node:path");var Ye=require("typeorm");var Se=new Ye.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",default:"{}"},createdAt:{type: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}}});var Ge=require("typeorm"),be=new Ge.EntitySchema({name:"UsersToTeams",tableName:"users_to_teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},role:{type:"varchar",default:"admin",nullable:!1}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"users"},user:{type:"many-to-one",target:()=>"User",inverseSide:"teams"}}});var je=require("typeorm");var Ee=new je.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 Ke=require("typeorm");var Ie=new Ke.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",default:"{}"},archived:{type:Boolean,default:!1},searchString:{type:String,default:()=>null}},relations:{team:{type:"many-to-one",target:()=>"Team",joinColumn:!0},user:{type:"many-to-one",target:()=>"User",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",joinColumn:!0}}});function so(){let e=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>",ze.default.homedir())),e}var w=new Ve.DataSource({type:T.str("APP_DB_TYPE"),database:so(),host:T.str("APP_DB_HOST"),username:T.str("APP_DB_USERNAME"),password:T.str("APP_DB_PASSWORD"),port:T.num("APP_DB_PORT"),schema:T.str("APP_DB_SCHEMA"),logging:T.bool("APP_DB_LOGGING"),migrationsRun:!0,migrations:[Je.posix.join(__dirname,"migrations","*.js")],entities:[ye,we,Te,ge,be,he,Se,Ee,Ie]}),Xe=async()=>{if(!w.isInitialized)return w.initialize();throw new Error("Already initialized")},v=w.getRepository(ye),E=w.getRepository(we),k=w.getRepository(Te),S=w.getRepository(ge),N=w.getRepository(be),$=w.getRepository(he),I=w.getRepository(Se),_=w.getRepository(Ee),O=w.getRepository(Ie);var Ze=T.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),et=T.num("PORT",4466),G={port:et,host:D.bindServerUrl,allowedOrigins:Ze.includes("*")?"*":[`http://localhost:${et}`,...Ze]};var g=e=>(t,r,o)=>{e(t),o()};var j=require("jose");var i=class extends Error{constructor(r,o){super(o);this.status=r;this.message=o}};var tt=new TextEncoder,rt=tt.encode(T.str("JWT_SECRET")),ot=tt.encode(T.str("JWT_REFRESH_SECRET")),Re=async({userId:e})=>new j.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign(rt),Ce=async({userId:e})=>new j.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign(ot),at=async(e,t)=>{try{let{payload:r}=await(0,j.jwtVerify)(e,t);if(!r.sub)throw new i(401,"Failed to verify access token");return{userId:r.sub}}catch(r){throw r instanceof i?r:r instanceof Error?new i(401,r.message):new i(401,"Failed to verify refresh token")}},nt=async e=>at(e,rt),st=async e=>at(e,ot);var y=(e,t)=>{let r=e.body;return t&&t(r),r},U=(e,t)=>{let r=e.query;return t&&t(r),r},d=(e,t)=>{let r=e.params;return t&&t(r),r};var ut=P(require("bcryptjs"));var it=e=>{if(!e?.username)throw new i(400,"Username is required");if(!e?.password)throw new i(400,"Password is required")};var oe="DATARAMEN_refresh_token",Ne={httpOnly:!0,secure:T.bool("PROD"),sameSite:T.bool("PROD"),path:"/",maxAge:14400*60},ct=g(e=>{e.route({method:"post",url:"/login",config:{isPublic:!0},handler:async(t,r)=>{let{username:o,password:a}=y(t,it),n=await S.findOne({where:{username:o}});if(!n||!ut.default.compareSync(a,n.password))throw new i(401,"Invalid credentials");let[s,u]=await Promise.all([Re({userId:n?.id}),Ce({userId:n?.id})]);return r.setCookie(oe,u,Ne),{data:{accessToken:s}}}}),e.route({method:"post",url:"/refresh",config:{isPublic:!0},handler:async(t,r)=>{let o=t.cookies[oe];if(!o)return r.code(401).send({message:"Missing refresh token"});let{userId:a}=await st(o),[n,s]=await Promise.all([Re({userId:a}),Ce({userId:a})]);return r.setCookie(oe,s,Ne),{data:{accessToken:n}}}}),e.route({method:"post",url:"/logout",config:{isPublic:!0},handler:async(t,r)=>(r.clearCookie(oe,Ne),{data:!0})})});var mt=e=>{if(!e.dbUrl)throw new i(400,"url is required");if(!e.dbUser)throw new i(400,"user is required");if(!e.dbType)throw new i(400,"type is required");if(!e.name)throw new i(400,"name is required");if(!e.dbDatabase)throw new i(400,"database is required")};var pt=P(require("mysql2/promise"));function K(e){if(e!==void 0)return e.toLowerCase()}var io=({database:e,password:t,user:r,url:o})=>pt.default.createConnection({host:re(o),user:r,database:e,password:t,dateStrings:!0}),uo=async e=>{let t=`
|
|
1
|
+
"use strict";var Vr=Object.create;var Ue=Object.defineProperty;var zr=Object.getOwnPropertyDescriptor;var Jr=Object.getOwnPropertyNames;var Xr=Object.getPrototypeOf,Zr=Object.prototype.hasOwnProperty;var eo=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of Jr(t))!Zr.call(e,a)&&a!==r&&Ue(e,a,{get:()=>t[a],enumerable:!(o=zr(t,a))||o.enumerable});return e};var P=(e,t,r)=>(r=e!=null?Vr(Xr(e)):{},eo(t||!e||!e.__esModule?Ue(r,"default",{value:e,enumerable:!0}):r,e));var ee=require("dotenv"),te=require("node:path"),qe=require("node:fs");var X=e=>{function t(a,n=void 0){return e[a]||n}function r(a,n=void 0){let s=e[a];if(!s)return n;let u=Number(s);return!isNaN(u)&&s.trim()!==""?u:n}function o(a){return e[a]==="true"||e[a]==="TRUE"||e[a]==="1"}return{str:t,num:r,bool:o}};function to(e){let t={mode:void 0,env:void 0};for(let r of e){if(!r.startsWith("--"))continue;let[o,...a]=r.slice(2).split("=");if(!o||a.length===0)continue;let n=a.join("=");n=n.replace(/^["'](.+)["']$/,"$1"),t[o]=n}return t}var Z=X(to(process.argv.slice(2)));var ro=(()=>{try{let e=(0,qe.readFileSync)((0,te.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})(),ke=[],Le=Z.str("env");Le&&ke.push((0,te.resolve)(Le));(0,ee.config)({path:ke});var fe={APP_DB_TYPE:"sqlite",APP_DB_DATABASE:"<home>/.dataramen/.runtime/db.sqlite3"};(0,ee.populate)(process.env,{SERVER_VERSION:ro.version,PROD:"true",...fe},{override:!1});var oo=["SYMM_ENCRYPTION_KEY","JWT_SECRET","JWT_REFRESH_SECRET"],Me=()=>{let e=[];for(let t of oo)process.env[t]||e.push(t);if(e.length>0)throw new Error("Following env variables are required but not provided: "+e.join(", "))},T=X(process.env),Qe=()=>T.str("APP_DB_TYPE")!==fe.APP_DB_TYPE&&T.str("APP_DB_DATABASE")!==fe.APP_DB_DATABASE;var Gc=require("reflect-metadata"),$r=P(require("fastify")),Wr=P(require("qs"));var Ve=require("typeorm");var Fe=require("typeorm");var ao={default:{bindServerUrl:"0.0.0.0",skipAuth:!1,name:"default"},docker:{bindServerUrl:"0.0.0.0",skipAuth:!1,name:"docker"},cli:{bindServerUrl:"127.0.0.1",skipAuth:!0,name:"cli"},dev:{bindServerUrl:"127.0.0.1",skipAuth:!0,name:"dev"}},no=Z.str("mode","default"),D=ao[no];var h=T.str("APP_DB_TYPE")==="sqlite"?"datetime":"timestamp",re=D.name==="docker"?e=>e==="localhost"||e==="127.0.0.1"?"host.docker.internal":e:e=>e;var ye=new Fe.EntitySchema({name:"DatabaseInspection",tableName:"db_inspection",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},tableName:{nullable:!0,type:String},columns:{type:"json",nullable:!0},createdAt:{type:h,createDate:!0},updatedAt:{type:h,updateDate:!0}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var Be=require("typeorm");var Te=new Be.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 $e=require("typeorm");var ge=new $e.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 We=require("typeorm");var he=new We.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 He=require("typeorm");var we=new He.EntitySchema({name:"DataSource",tableName:"data_sources",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},dbUrl:{type:String},dbPort:{type:Number,nullable:!0},dbUser:{type:String},dbPassword:{type:String,nullable:!0,select:!1},dbPasswordIv:{type:String,nullable:!0,select:!1},dbPasswordTag:{type:String,nullable:!0,select:!1},dbType:{type:String},createdAt:{type: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},inspections:{type:"one-to-many",target:()=>"DatabaseInspection",inverseSide:"datasource"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"dataSource"},owner:{type:"many-to-one",target:()=>"User",joinColumn:!0}}});var ze=P(require("node:os")),Je=require("node:path");var Ye=require("typeorm");var Se=new Ye.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",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}}});var Ge=require("typeorm"),be=new Ge.EntitySchema({name:"UsersToTeams",tableName:"users_to_teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},role:{type:"varchar",default:"admin",nullable:!1}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"users"},user:{type:"many-to-one",target:()=>"User",inverseSide:"teams"}}});var je=require("typeorm");var Ee=new je.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 Ke=require("typeorm");var Ie=new Ke.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},searchString:{type:String,default:()=>null}},relations:{team:{type:"many-to-one",target:()=>"Team",joinColumn:!0},user:{type:"many-to-one",target:()=>"User",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",joinColumn:!0}}});function so(){let e=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>",ze.default.homedir())),e}var w=new Ve.DataSource({type:T.str("APP_DB_TYPE"),database:so(),host:T.str("APP_DB_HOST"),username:T.str("APP_DB_USERNAME"),password:T.str("APP_DB_PASSWORD"),port:T.num("APP_DB_PORT"),schema:T.str("APP_DB_SCHEMA"),logging:T.bool("APP_DB_LOGGING"),migrationsRun:!0,migrations:[Je.posix.join(__dirname,"migrations","*.js")],entities:[ye,we,Te,ge,be,he,Se,Ee,Ie]}),Xe=async()=>{if(!w.isInitialized)return w.initialize();throw new Error("Already initialized")},v=w.getRepository(ye),E=w.getRepository(we),k=w.getRepository(Te),S=w.getRepository(ge),N=w.getRepository(be),$=w.getRepository(he),I=w.getRepository(Se),_=w.getRepository(Ee),O=w.getRepository(Ie);var Ze=T.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),et=T.num("PORT",4466),G={port:et,host:D.bindServerUrl,allowedOrigins:Ze.includes("*")?"*":[`http://localhost:${et}`,...Ze]};var g=e=>(t,r,o)=>{e(t),o()};var j=require("jose");var i=class extends Error{constructor(r,o){super(o);this.status=r;this.message=o}};var tt=new TextEncoder,rt=tt.encode(T.str("JWT_SECRET")),ot=tt.encode(T.str("JWT_REFRESH_SECRET")),Re=async({userId:e})=>new j.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign(rt),Ce=async({userId:e})=>new j.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign(ot),at=async(e,t)=>{try{let{payload:r}=await(0,j.jwtVerify)(e,t);if(!r.sub)throw new i(401,"Failed to verify access token");return{userId:r.sub}}catch(r){throw r instanceof i?r:r instanceof Error?new i(401,r.message):new i(401,"Failed to verify refresh token")}},nt=async e=>at(e,rt),st=async e=>at(e,ot);var y=(e,t)=>{let r=e.body;return t&&t(r),r},U=(e,t)=>{let r=e.query;return t&&t(r),r},d=(e,t)=>{let r=e.params;return t&&t(r),r};var ut=P(require("bcryptjs"));var it=e=>{if(!e?.username)throw new i(400,"Username is required");if(!e?.password)throw new i(400,"Password is required")};var oe="DATARAMEN_refresh_token",Ne={httpOnly:!0,secure:T.bool("PROD"),sameSite:T.bool("PROD"),path:"/",maxAge:14400*60},ct=g(e=>{e.route({method:"post",url:"/login",config:{isPublic:!0},handler:async(t,r)=>{let{username:o,password:a}=y(t,it),n=await S.findOne({where:{username:o}});if(!n||!ut.default.compareSync(a,n.password))throw new i(401,"Invalid credentials");let[s,u]=await Promise.all([Re({userId:n?.id}),Ce({userId:n?.id})]);return r.setCookie(oe,u,Ne),{data:{accessToken:s}}}}),e.route({method:"post",url:"/refresh",config:{isPublic:!0},handler:async(t,r)=>{let o=t.cookies[oe];if(!o)return r.code(401).send({message:"Missing refresh token"});let{userId:a}=await st(o),[n,s]=await Promise.all([Re({userId:a}),Ce({userId:a})]);return r.setCookie(oe,s,Ne),{data:{accessToken:n}}}}),e.route({method:"post",url:"/logout",config:{isPublic:!0},handler:async(t,r)=>(r.clearCookie(oe,Ne),{data:!0})})});var mt=e=>{if(!e.dbUrl)throw new i(400,"url is required");if(!e.dbUser)throw new i(400,"user is required");if(!e.dbType)throw new i(400,"type is required");if(!e.name)throw new i(400,"name is required");if(!e.dbDatabase)throw new i(400,"database is required")};var pt=P(require("mysql2/promise"));function K(e){if(e!==void 0)return e.toLowerCase()}var io=({database:e,password:t,user:r,url:o})=>pt.default.createConnection({host:re(o),user:r,database:e,password:t,dateStrings:!0}),uo=async e=>{let t=`
|
|
2
2
|
SELECT LOWER(TABLE_NAME) as TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION
|
|
3
3
|
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
|
|
4
4
|
WHERE CONSTRAINT_NAME = 'PRIMARY'
|
|
@@ -54,5 +54,5 @@
|
|
|
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),{})},yt=async(e,t,r,o)=>{try{console.log(`[PG CONN] Query: ${e}`),console.log(`[PG CONN] Params: ${JSON.stringify(t,null,2)}`);let{rows:a,fields:n,command:s,rowCount:u}=await r.query({text:e,rowMode:"array",values:t});if(s==="UPDATE"||s==="INSERT"||s==="DELETE"){if(u!=null&&u>1&&o.allowBulkUpdate!==!0)throw new Error("[PG CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[u]],query:e}}if(s==="SELECT"){let c=n.map(p=>`'${p.tableID}-${p.columnID}'`),m=await ho(c,r);return{columns:n.map(p=>{let f=m[`${p.tableID}-${p.columnID}`];return{column:f?.column||p.name,alias:p.name,table:f?.table||"",full:f?f.table+"."+f.column:p.name}}),rows:a,query:e}}throw new Error(`[PG CONN] Unsupported command: ${s}`)}catch(a){throw a instanceof i?a:new i(400,a.message)}},wo=async(e,t)=>{await e.query("BEGIN");try{let r=await t();return await e.query("COMMIT"),console.log("[PG CONN] Commit"),r}catch(r){throw await e.query("ROLLBACK"),console.log("[PG CONN] Rollback"),r}},So=async(e,t)=>{await e.query("BEGIN READ ONLY");try{let r=await t();return console.log("[PG CONN] Read only rollback"),await e.query("ROLLBACK"),r}catch(r){throw console.log("[PG CONN] Rollback"),await e.query("ROLLBACK"),r}},gt=async e=>{let t=await fo(e),r=!1,o=!1,a=async n=>(o||await t.query(`SET search_path TO ${e.schema}`),n());return{dbType:"postgres",dataSource:e,inspectSchema:()=>go(e,t),executeQuery:n=>a(()=>n.type==="SELECT"?So(t,()=>yt(n.sql,n.params,t,n)):wo(t,()=>yt(n.sql,n.params,t,n))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.end()}}};var M=async(e,t,r)=>{try{let o;if(t==="mysql")o=await ft(e);else if(t==="postgres")o=await gt(e);else throw new i(500,`Connection manager for ${t} not found`);return r.__connections?r.__connections.push(o):r.__connections=[o],o}catch(o){throw console.error(o),o instanceof i?o:o?.code==="ECONNREFUSED"?new i(500,"Failed to connect to the database"):new i(500,o.message)}};var ae=P(require("node:crypto"));var ht="aes-256-gcm",bo=12,wt=()=>{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},Eo=e=>{let t=ae.default.randomBytes(bo),r=wt(),o=ae.default.createCipheriv(ht,r,t),a=o.update(e,"utf8","hex");a+=o.final("hex");let n=o.getAuthTag();return{encrypted:a,iv:t.toString("hex"),tag:n.toString("hex")}},Io=({encrypted:e,iv:t,tag:r})=>{let o=wt(),a=ae.default.createDecipheriv(ht,o,Buffer.from(t,"hex"));a.setAuthTag(Buffer.from(r,"hex"));let n=a.update(e,"hex","utf8");return n+=a.final("utf8"),n},ne={encrypt:Eo,decrypt:Io};var Q=(e,t=!1)=>{if(t){let r=ne.decrypt({encrypted:e.dbPassword,tag:e.dbPasswordTag,iv:e.dbPasswordIv});return{url:e.dbUrl,user:e.dbUser,database:e.dbDatabase,password:r,port:e.dbPort,schema:e.dbSchema}}return{url:e.dbUrl,user:e.dbUser,database:e.dbDatabase,password:e.dbPassword,port:e.dbPort,schema:e.dbSchema}};var St=[{value:"=",label:"equals"},{value:"<>",label:"not equal"},{value:">",label:"greater than"},{value:">=",label:"greater than or equal"},{value:"<",label:"less than"},{value:"<=",label:"less than or equal"},{value:"LIKE",label:"like"},{value:"NOT LIKE",label:"not like"},{value:"CONTAINS",label:"contains"},{value:"NOT CONTAINS",label:"not contains"},{value:"IN",label:"in list"},{value:"NOT IN",label:"not in list"},{value:"IS NULL",label:"is null"},{value:"IS NOT NULL",label:"is not null"}],Ro=St.reduce((e,t)=>(e[t.value]=t.label,e),{}),jn=St.reduce((e,t)=>(e[t.label]=t.value,e),{}),W=e=>e.map(t=>({label:Ro[t],value:t})),Kn=W(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),Vn=W(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL","CONTAINS","NOT CONTAINS"]),zn=W(["=","<>","IS NULL","IS NOT NULL"]),Jn=W(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),Xn=W(["IS NULL","IS NOT NULL"]),Zn=W(["IN","NOT IN"]),Co=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"],No=new Set(Co),se=e=>No.has(e),Oo=["integer","smallint","decimal","numeric","float","real","double precision","int","smallint","integer","bigint","decimal","numeric","real","double precision","serial","bigserial","money"],Ao=new Set(Oo),bt=e=>Ao.has(e);var es=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var Oe={read_only:10,editor:20,admin:30,owner:40};var A=e=>e.startsWith("'")&&e.endsWith("'")||e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e;var Et={operator:"LIKE",parse:e=>{let t=e.match(/^LIKE\s*["'](.*)["']$/i);if(t)return[{value:A(t[1])}]},stringify:e=>`LIKE "%${e[0]?.value}%"`},It={operator:"NOT LIKE",parse:e=>{let t=e.match(/^NOT LIKE\s*["'](.*)["']$/i);if(t)return[{value:A(t[1])}]},stringify:e=>`NOT LIKE "%${e[0]?.value}%"`},Rt={operator:"CONTAINS",parse:e=>{let t=e.match(/^CONTAINS\s*["'](.*)["']$/i);if(t)return[{value:A(t[1])}]},stringify:(e,t)=>se(t)?`${e[0]?.value}`:`CONTAINS "%${e[0]?.value}%"`},Ct={operator:"NOT CONTAINS",parse:e=>{let t=e.match(/^NOT CONTAINS\s*["'](.*)["']$/i);if(t)return[{value:A(t[1])}]},stringify:e=>`NOT CONTAINS "%${e[0]?.value}%"`};function Ot(e){return e===""?[]:Po(e).map(Do)}function Po(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 Do(e){if(e.startsWith("'")&&e.endsWith("'"))return{value:Nt(e.slice(1,-1),"'")};if(e.startsWith('"')&&e.endsWith('"'))return{value:Nt(e.slice(1,-1),'"')};let t=Number(e);if(!Number.isNaN(t))return{value:t};throw new Error(`Invalid literal: ${e}`)}function Nt(e,t){return e.replace(/\\(.)/g,(r,o)=>o)}var At={operator:"IN",parse:e=>{let t=e.match(/^in\s*\((.*)\)$/i);if(t)return Ot(t[1])},stringify:e=>`IN (${e?.map(t=>`"${t.value}"`).join(", ")})`},Pt={operator:"NOT IN",parse:e=>{let t=e.match(/^not\s+in\s*\((.*)\)$/i);if(t)return Ot(t[1])},stringify:e=>`NOT IN (${e?.map(t=>`"${t.value}"`).join(", ")})`};var Dt={operator:"=",parse:e=>{let t=e.match(/^=\s*(.*)$/);if(t)return[{value:A(t[1])}]},stringify:(e,t)=>bt(t)?`${e[0]?.value}`:`= ${e[0]?.value}`},xt={operator:"!=",parse:e=>{let t=e.match(/^!=\s*(.*)$/);if(t)return[{value:A(t[1])}]},stringify:e=>`!= ${e[0]?.value}`},vt={operator:"<>",parse:e=>{let t=e.match(/^<>\s*(.*)$/);if(t)return[{value:A(t[1])}]},stringify:e=>`<> ${e[0]?.value}`},_t={operator:">",parse:e=>{let t=e.match(/^>\s*(.*)$/);if(t)return[{value:A(t[1])}]},stringify:e=>`> ${e[0]?.value}`},Ut={operator:">=",parse:e=>{let t=e.match(/^>=\s*(.*)$/);if(t)return[{value:A(t[1])}]},stringify:e=>`>= ${e[0]?.value}`},Lt={operator:"<",parse:e=>{let t=e.match(/^<\s*(.*)$/);if(t)return[{value:A(t[1])}]},stringify:e=>`< ${e[0]?.value}`},qt={operator:"<=",parse:e=>{let t=e.match(/^<=\s*(.*)$/);if(t)return[{value:A(t[1])}]},stringify:e=>`<= ${e[0]?.value}`};var kt={operator:"IS NULL",parse:e=>{if(/^is\s+null$/i.test(e))return[]},stringify:()=>"IS NULL"},Mt={operator:"IS NOT NULL",parse:e=>{if(/^is\s+not\s+null$/i.test(e))return[]},stringify:()=>"IS NOT NULL"};var xo=[Et,Rt,It,Ct,At,Pt,Dt,xt,vt,Ut,_t,qt,Lt,kt,Mt];function vo(e){let t=e.trim();for(let r of xo){let o=r.parse(t);if(o)return{operator:r.operator,value:o}}}var Qt={parse:vo};var b=e=>{let t=Oe[e];return r=>Oe[r.currentTeamRole]>=t},Ft=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 Bt=g(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=d(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}=U(t);return{data:await E.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",config:{requireRole:b("admin")},handler:async t=>{let{teamId:r,ownerId:o,...a}=y(t,mt),n=E.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),s=await M(Q(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:m}=ne.encrypt(n.dbPassword);return n.dbPassword=m,n.dbPasswordIv=c,n.dbPasswordTag=u,{data:await E.save(n)}}}),e.route({method:"put",url:"/:id",config:{requireRole:b("admin")},handler:async t=>{let{id:r}=d(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:b("admin")},handler:async(t,r)=>w.transaction(async()=>{let{id:o}=d(t);await Promise.all([v.delete({datasource:{id:o}}),I.delete({dataSource:{id:o}})]),await E.delete({id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=d(t),a=await E.findOne({where:{id:o},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]});if(!a)throw new Error("Data source not found");a.status="INSPECTING",await E.save(a);let s=await(await M(Q(a,!0),a.dbType,t)).inspectSchema();await v.delete({datasource:{id:o}}),await v.insert(s.sort().map(u=>v.create({tableName:u.tableName,columns:u.columns,datasource:{id:o}}))),a.status="READY",a.lastInspected=new Date,await E.save(a)}}),e.route({method:"get",url:"/:id/inspections",handler:async t=>{let{id:r}=d(t);return{data:await v.find({where:{datasource:{id:r}}})}}})});var L=require("typeorm"),$t=g(e=>{e.route({method:"get",url:"/team/:teamId/datasources",handler:async t=>{let{teamId:r}=d(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=d(t),o=U(t),a=r.teamId||t.user.currentTeamId,n=Number(o.size)||20,s=Number(o.page)||0,u=o.nameFilter?.length?{name:(0,L.Raw)(f=>`LOWER(${f}) LIKE :search`,{search:`%${o.nameFilter.toLowerCase()}%`})}:void 0,c=await _.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"}}}),m=c.length>n;return m&&c.pop(),{data:c.map(f=>({name:f.query.name,id:f.query.id,updatedAt:f.query.updatedAt,savedQueryId:f.id,datasourceName:f.query.dataSource.name,datasourceType:f.query.dataSource.dbType})),hasMore:m}}}),e.route({method:"get",url:"/team/:teamId/count-saved-queries",handler:async t=>{let o=d(t).teamId||t.user.currentTeamId;return{data:await _.count({where:[{isPersonal:!1,team:{id:o}},{isPersonal:!0,team:{id:o},user:{id:t.user.id}}],select:{id:!0}})}}}),e.route({method:"get",url:"/team/:teamId/query",handler:async t=>{let{teamId:r}=d(t),{search:o,size:a,selectedDataSources:n}=U(t),s=o.length>3?parseInt(a)||20:8,u={};n?.length&&(u.id=(0,L.In)(n));let[c,m,p]=await Promise.all([v.find({where:{tableName:(0,L.Raw)(l=>`LOWER(${l}) LIKE :search`,{search:`%${o.toLowerCase()}%`}),datasource:u},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:s}),O.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:"ASC"},take:s}),_.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:"ASC"},take:s})]),f=[];return c.forEach(l=>{f.push({name:l.tableName,id:l.id,dataSourceName:l.datasource?.name||"--",dataSourceId:l.datasource?.id||"--",type:"table"})}),m.forEach(l=>{f.push({name:l.name,id:l.id,dataSourceName:l.dataSource?.name||"--",dataSourceId:l.dataSource?.id||"--",type:"tab"})}),p.forEach(l=>{f.push({name:l.query.name,id:l.query.id,dataSourceName:l.query.dataSource?.name||"--",dataSourceId:l.query.dataSource?.id||"--",type:"query"})}),{data:f}}}),e.route({method:"get",url:"/team/:teamId/tabs-history",handler:async t=>{let{teamId:r}=d(t),o=U(t),a=Number(o.page),n=Number(o.size),s=t.user.id,u={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 O.find({where:u,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(p=>({name:p.name,id:p.id,updatedAt:p.updatedAt,archived:p.archived,createdAt:p.createdAt,dataSourceId:p.dataSource?.id,dataSourceName:p.dataSource?.name,dataSourceType:p.dataSource?.dbType})),hasMore:m}}})});var Wt=g(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=d(t),o=await I.findOne({where:{id:r},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return o?{data:o}:{status:404,data:"Query not found"}}}),e.route({method:"post",url:"/",config:{requireRole:b("editor")},handler:async t=>{let r=y(t),o=await E.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await I.save(I.create({name:r.name,opts:r.opts,team:{id:o?.team.id},dataSource:{id:r.dataSourceId},user:{id:t.user.id}}))}}}),e.route({method:"patch",url:"/:id",config:{requireRole:b("editor")},handler:async t=>{let{id:r}=d(t),o=y(t);if(!(await I.update(r,o)).affected)throw new i(404,"Query not found");return{data:await I.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",config:{requireRole:b("editor")},handler:async t=>w.transaction(async()=>{let{id:r}=d(t);if(!(await I.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var Ht=e=>se(e)?"CONTAINS":"=",Pe=(e,t)=>{let r=[];for(let o of e)if(!(!o.column?.length||!o.value?.length||o.isEnabled===!1))if(o.isAdvanced){let a=Qt.parse(o.value);if(!a)throw new i(400,`Invalid value for '${o.column}': ${o.value}`);r.push({value:a.value,column:o.column,operator:a.operator||Ht(t(o.column)),fn:o.fn})}else r.push({value:o.value?[{value:o.value}]:[],column:o.column,operator:Ht(t(o.column)),fn:o.fn});return r},Yt=e=>{let t=[e.table];return e.joins&&e.joins.forEach(({table:r})=>t.push(r)),t},Ae=e=>({column:e.value,fn:e.fn,distinct:e.distinct}),Gt=(e,t,r)=>{let o=[];return t.length>0||r.length>0?o.push(...t.map(Ae),...r.map(Ae)):e.length>0&&o.push(...e.map(Ae)),o},jt=(e,t,r)=>t.map((o,a)=>({...o,full:e[a].fn?e[a].column:o.full,type:r(o.full),fn:e[a].fn}));var De=require("typeorm"),Kt=new De.DataSource({type:"mysql"}),Vt=new De.DataSource({type:"postgres"}),H=e=>{switch(e){case"postgres":return Vt.createQueryBuilder();case"mysql":return Kt.createQueryBuilder();default:throw new Error("Unsupported database connection")}},ie={postgres:Vt.driver,mysql:Kt.driver};var V=(e,t,r)=>{let{column:o,operator:a,value:n}=e,s="_"+t;switch(a){case"IS NULL":case"IS NOT NULL":return[`${o} ${a}`,{value:void 0}];case"IN":case"NOT IN":return[`${o} ${a} (:...${s})`,{[s]:n?.map(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 zt=e=>{let t=ie[e];return r=>{if(r.includes(".")){let[o,a]=r.split(".");return t.escape(o)+"."+t.escape(a)}return r==="*"?r:t.escape(r)}};var Jt=["SUM","COUNT","AVG","MAX","MIN"],_o=["YEAR","MONTH","DAY",...Jt],Uo=_o.reduce((e,t)=>(e[t]=!0,e),{}),Lo=Jt.reduce((e,t)=>(e[t]=!0,e),{}),Xt=e=>Uo[e],Zt=e=>Lo[e];var ue=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,er={YEAR:e=>`EXTRACT(YEAR FROM ${e})`,MONTH:e=>`EXTRACT(MONTH FROM ${e})`,DAY:e=>`EXTRACT(DAY FROM ${e})`,SUM:(e,t,r)=>r?`COALESCE(SUM(distinct ${e}), 0)`:`COALESCE(SUM(${e}), 0)`,AVG:ue,MAX:ue,MIN:ue,COUNT:ue};var ce=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,tr={YEAR:e=>`YEAR(${e})`,MONTH:e=>`MONTH(${e})`,DAY:e=>`DAY(${e})`,SUM:(e,t,r)=>r?`coalesce(${t}(distinct ${e}), 0)`:`coalesce(${t}(${e}), 0)`,AVG:ce,MAX:ce,MIN:ce,COUNT:ce};var qo=e=>{let t=[];return e.fn&&t.push(e.fn),e.distinct&&t.push("distinct"),t.push(e.column),t.join(" ")},ko=e=>{let t=zt(e),r=e==="postgres"?er:tr;return o=>o.fn&&Xt(o.fn)?r[o.fn](t(o.column),o.fn,o.distinct):t(o.column)};function rr(e,t){let r=H(t.dbType).from(e,e),o=!1,a=0,n=ko(t.dbType),s={};return{setColumns(u){u.forEach(c=>{let m=qo(c);s[m]=m,r.addSelect(n(c),m)})},setLimit:u=>{r.limit(u),o=!0},setOffset(u){r.skip(u)},addOrderBy(u,c){r.addOrderBy(u,c)},addJoin({table:u,alias:c,on:m}){r.leftJoin(u,c||u,m)},addWhere(u){let[c,m]=V({...u,operator:u.operator||"=",column:n(u)},++a,t.dbType);r.andWhere(c,m)},addHaving(u){let[c,m]=V({...u,operator:u.operator||"=",column:n(u)},++a,t.dbType);r.andHaving(c,m)},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 or=(e,t)=>{let r=H(t.dbType).update(e),o=0;return{addWhere(a){let[n,s]=V(a,++o,t.dbType);r.andWhere(n,s)},setParams(a){let n={};for(let[s,u]of Object.entries(a)){let c=`${u}`;c.startsWith("=")?n[s]=()=>c.substring(1):n[s]=c}r.set(n)},build(){let[a,n]=r.getQueryAndParameters();return{sql:a,params:n}}}};var ar=(e,t)=>{let r=H(t.dbType).insert().into(e);return{setValues(o){let a={};for(let[n,s]of Object.entries(o)){let u=`${s}`;u.startsWith("=")?a[n]=()=>u.substring(1):a[n]=u}r.values([a])},build(){let[o,a]=r.getQueryAndParameters();return{sql:o,params:a}}}};var xe=rr,nr=or,sr=ar;var ir=require("typeorm"),ur=async(e,t)=>{let r=await v.find({where:{tableName:(0,ir.In)(t),datasource:{id:e}}}),o=[];for(let s of r)if(s.columns)for(let u of s.columns)o.push({column:u.name,table:s.tableName||"",full:`${s.tableName}.${u.name}`,type:u.type});let a=o.reduce((s,u)=>(s[u.full]=u.type,s),{});return{getAllColumns(){return o},getColumnType:s=>a[s],hasColumn(s){return!!a[s]||s==="*"}}};async function Mo(e,t,r){return I.save(I.create({user:{id:e},team:{id:t},dataSource:{id:r.datasourceId},name:r.name,opts:r.opts}))}var me=async(e,t)=>{let{datasourceId:r,size:o=20,page:a}=t,{table:n,joins:s,groupBy:u,orderBy:c}=t.opts,m=await le(r);if(!m)throw new i(404,"Datasource not found");let p=Gt(t.opts.columns,t.opts.groupBy,t.opts.aggregations),f=Yt(t.opts),l=await ur(r,f),C=l.getAllColumns(),q;p&&p.length>0?q=p:q=C.map(R=>({column:R.full})),q.forEach(R=>{if(!l.hasColumn(R.column))throw new i(400,`Invalid column ${R.column}`)});let Hr=Mo(e.user.id,e.user.currentTeamId,t),x=xe(n,m);x.setLimit(o+1),x.setOffset(o*a),x.setColumns(q),s&&s.forEach(x.addJoin),c.length>0&&c.forEach(({column:R,direction:Kr})=>{x.hasAlias(R)&&x.addOrderBy(ie[m.dbType].escape(R),Kr)}),u&&u.length>0&&u.forEach(R=>{l.hasColumn(R.value)&&x.addGroupBy({column:R.value,fn:R.fn,distinct:R.distinct})}),Pe(t.opts.filters,l.getColumnType).forEach(R=>{R.fn&&Zt(R.fn)?x.addHaving(R):x.addWhere(R)});let{sql:Yr,params:Gr}=x.build(),J=await(await M(Q(m,!0),m.dbType,e)).executeQuery({sql:Yr,params:Gr,type:"SELECT",allowBulkUpdate:!1}),_e=J.rows.length>o;_e&&J.rows.pop();let{id:jr}=await Hr;return{...J,queryHistoryId:jr,tables:f,allColumns:C,columns:jt(q,J.columns,l.getColumnType),hasMore:_e}},cr=async(e,t)=>{let r=await le(t.dataSourceId);if(!r)throw new i(400,"Invalid datasource");let o=await M(Q(r,!0),r.dbType,e),a=xe(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:s}=a.build(),u=await o.executeQuery({sql:n,params:s,type:"SELECT",allowBulkUpdate:!1});if(u.rows.length>1)throw new i(400,"Found multiple rows for given query");if(u.rows.length<1)throw new i(404,"Entity not found");return{entity:u.rows[0],columns:u.columns,sql:n}},mr=async(e,t)=>{let r=await le(t.datasourceId);if(!r)throw new i(404,"Data source not found");if(!r.allowUpdate)throw new i(403,"This datasource does not allow update operations");let o=nr(t.table,r);o.setParams(t.values),Pe(t.filters,()=>"=").forEach(u=>{o.addWhere(u)});let{sql:a,params:n}=o.build();return(await M(Q(r,!0),r.dbType,e)).executeQuery({sql:a,params:n,type:"UPDATE",allowBulkUpdate:!1})},lr=async(e,t)=>{let r=await le(t.datasourceId);if(!r)throw new i(404,"Data source not found");if(!r.allowInsert)throw new i(403,"This datasource does not allow insert operations");let o=sr(t.table,r);o.setValues(t.values);let{sql:a,params:n}=o.build();return(await M(Q(r,!0),r.dbType,e)).executeQuery({sql:a,type:"INSERT",params:n,allowBulkUpdate:!1})};async function le(e){return E.findOne({where:{id:e},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowUpdate","allowInsert"]})}var dr=e=>{},Qo=["--",";","DROP","drop"],pr=([e,t])=>{if(typeof t=="string"&&t.startsWith("=")){let r=t;Qo.forEach(o=>{if(r.includes(o))throw new i(400,"Invalid input value for "+e)})}},fr=e=>{if(!e.table)throw new i(400,"Table is required");Object.entries(e.values).forEach(pr)},yr=e=>{if(!e.table)throw new i(400,"Table is required");Object.entries(e.values).forEach(pr)};var Tr=g(e=>{e.route({method:"post",url:"/:dsId/select",handler:async t=>{let r=y(t,dr);return{data:await me(t,r)}}}),e.route({method:"get",url:"/:dsId/entity/:table",handler:async t=>{let{dsId:r,table:o}=d(t),a=U(t);return{data:await cr(t,{table:o,dataSourceId:r,props:a})}}}),e.route({method:"post",url:"/:dsId/insert",config:{requireRole:b("editor")},handler:async t=>{let r=y(t,fr);return{data:await lr(t,r)}}}),e.route({method:"post",url:"/:dsId/update",config:{requireRole:b("editor")},handler:async t=>{let r=y(t,yr);return{data:await mr(t,r)}}})});var gr=g(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:T.str("SERVER_VERSION")}}))});var hr=g(e=>{e.route({method:"get",url:"/:id/users",handler:async t=>{let{id:r}=d(t),o=await k.findOne({where:{id:r},relations:{users:{user:!0}}});if(!o)throw new 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:b("editor")},handler:async t=>w.transaction(async()=>{let r=t.user.id,o=y(t),a=S.create();a.id=r;let n=k.create(o);await k.save(n);let s=N.create({user:a,team:n});return await N.save(s),{data:n}})}),e.route({method:"patch",url:"/:id/user-role",config:{requireRole:b("admin")},handler:async t=>{let{id:r}=d(t),{role:o,userId:a}=y(t,({role:s})=>{if(s==="owner")throw new i(400,"Only one owner is allowed")});if((await N.findOneBy({user:{id:a},team:{id:r}}))?.role==="owner")throw new i(400,"Cannot change owner role");await N.update({user:{id:a},team:{id:r}},{role:o})}}),e.route({method:"delete",url:"/:id",config:{requireRole:b("admin")},handler:async t=>w.transaction(async()=>{let{id:r}=d(t),{userId:o}=U(t);if((await N.findOneBy({user:{id:o},team:{id:r}}))?.role==="owner")throw new i(400,"Cannot delete team owner");await S.update(o,{currentTeam:null}),await N.delete({user:{id:o},team:{id:r}}),await S.delete({id:o})})})});var ve=P(require("bcryptjs")),z=async e=>{let t=await ve.default.genSalt(10);return ve.default.hash(e,t)};var wr=g(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=await S.findOne({where:{id:t.user.id},relations:{currentTeam:{team:!0}}});if(!r)throw new 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 z(o.password)),!(await S.update(r,o)).affected)throw new i(404,"User not found");let n=await S.findOne({where:{id:r},relations:{currentTeam:{team:!0}}});return{data:{id:n?.id,teamId:n?.currentTeam?.team.id,teamName:n?.currentTeam?.team.name,teamRole:n?.currentTeam?.role,username:n?.username}}}}),e.route({method:"post",url:"/",config:{requireRole:b("admin")},handler:async t=>w.transaction(async()=>{let r=y(t),o=await z(r.password),a=await S.save(S.create({username:r.username,password:o})),n=await N.save(N.create({role:"read_only",team:{id:r.teamId},user:{id:a.id}}));await S.update(a.id,{currentTeam:{id:n.id}})})})});var Sr=g(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=t.user.id,o=await $.findOneBy({user:{id:r}});return o||(o=await $.save($.create({user:{id:r}}))),{data:o}}}),e.route({method:"patch",url:"/",handler:async t=>{let{settings:r}=y(t);if(!r.id)throw new i(400,"Settings id is required!");if(!(await $.update(r.id,r)).affected)throw new i(404,"You do not own these settings!");return{data:await $.findOneBy({id:r.id})}}})});function Y(e,...t){let r=[...t];if(e.searchAll&&r.push(e.searchAll),e.filters)for(let o of e.filters)o.value&&r.push(o.value);return r.map(o=>o.toLowerCase()).join(",")}var br=g(e=>{e.route({method:"post",url:"/",config:{requireRole:b("editor")},handler:async t=>{let r=y(t),o=await I.findOne({where:{id:r.queryId}});if(!o)throw new i(400,"Query not found");let a=await _.save(_.create({isPersonal:!1,team:{id:t.user.currentTeamId},user:{id:t.user.id},query:{id:r.queryId},searchString:Y(o.opts,r.name)}));return await I.update(r.queryId,{name:r.name}),{data:a}}}),e.route({method:"delete",url:"/:id",config:{requireRole:b("editor")},handler:async t=>{let{id:r}=d(t);if(!(await _.delete({id:r})).affected)return{status:404,data:"Query not found"}}}),e.route({method:"patch",url:"/:id",handler:async t=>await w.transaction(async()=>{let{id:r}=d(t),o=y(t,s=>{if(!s.name)throw new i(400,"Name is required")}),a=await _.findOne({where:{id:r},relations:{query:!0}});if(!a)throw new i(400,"Query not found");let n=Y(a.query.opts,o.name);return await Promise.all([_.update({id:r},{searchString:n}),I.update({id:a.query.id},{name:o.name})]),{data:!0}})})});var Er=e=>{if(!e.queryId&&!(e.opts&&e.name))throw new i(400,"Either queryId or name and opts are required")};var Ir=g(e=>{e.route({method:"get",url:"/",handler:async t=>{let{currentTeamId:r,id:o}=t.user;return{data:(await O.find({where:{team:{id:r},user:{id:o},archived:!1},select:["id","name"]})).map(n=>({name:n.name,id:n.id}))}}}),e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=d(t),{currentTeamId:o,id:a}=t.user,n=await O.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,Er),n,s,u=o;if(r)s=r.dataSourceId,n=r;else{let m=await I.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,columns:m.opts.columns,groupBy:m.opts.groupBy,searchAll:m.opts.searchAll,aggregations:m.opts.aggregations,dataSourceId:m.dataSource.id,page:0,size:50},o||(u=m.name)}return{data:await O.save(O.create({name:u||new Date().toISOString(),opts:n,dataSource:{id:s},user:{id:t.user.id},team:{id:t.user.currentTeamId}}))}}}),e.route({method:"post",url:"/:id/run",handler:async t=>{let{id:r}=d(t),o=y(t),a=await O.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&&O.update(r,{opts:o,searchString:Y(o,a.name),updatedAt:new Date}),{data:{result:await me(t,{datasourceId:o.dataSourceId,size:o.size,name:a.name,page:o.page,opts:{table:o.table,filters:o.filters,joins:o.joins,orderBy:o.orderBy,columns:o.columns,groupBy:o.groupBy,searchAll:o.searchAll,aggregations:o.aggregations}})}}}}),e.route({method:"patch",url:"/:id",handler:async t=>{let{id:r}=d(t),o=y(t),a=await O.findOne({where:{id:r,user:{id:t.user.id}}});if(!a)throw new i(404,"Not Found");let n=a.searchString;return o.name&&(n=Y(a.opts,o.name)),await O.update(r,{...o,searchString:n}),{data:{id:r}}}}),e.route({method:"delete",url:"/:id",handler:async t=>{let{id:r}=d(t),o=t.user.id;return await O.delete({id:r,user:{id:o}}),{data:!0}}})});var Nr=require("node:crypto");var Rr=require("node:crypto"),Cr={teamName:"Default Team",username:"admin"},Fo=async()=>{let e=await k.findOneBy({});return e||k.save(k.create({name:Cr.teamName}))},de=async e=>{let t=await N.findOne({where:{role:"owner"},relations:{user:!0}});if(t)return t.user;let r=await Fo(),o=await z(e?.password||(0,Rr.randomBytes)(32).toString("hex")),a=await S.save(S.create({username:e?.name||Cr.username,password:o})),n=await N.save(N.create({user:a,team:r,role:"owner"}));return await S.update(a.id,{currentTeam:n}),a};var pe={setupAccessToken:void 0},Or=()=>(pe.setupAccessToken=(0,Nr.randomBytes)(32).toString("hex"),pe.setupAccessToken),Bo=e=>{if(!pe.setupAccessToken)throw new i(400,"Setup already performed");if(!e||e!==pe.setupAccessToken)throw new i(400,"Invalid setup access token")},B=async()=>D.skipAuth?!1:await S.count()<1,Ar=async e=>{Bo(e.setupAccessToken),await de({name:e.userName,password:e.userPassword})};var Pr=g(e=>{e.route({method:"get",url:"/client.config.js",handler:(t,r)=>{let o={skipAuth:D.skipAuth,modeName:D.name,usesCustomDb:Qe(),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 B()?r.redirect("/setup"):r.sendFile("index.html")}),e.route({method:"get",url:"/setup",handler:async(t,r)=>await B()?r.sendFile("setup.html"):r.redirect("/")})});var Dr=e=>{if(!e.setupAccessToken)throw new i(400,"Invalid setup access token");if(!e.userPassword||e.userPassword.length<8)throw new i(400,"Password should be at least 8 chars long");if(!e.userName)throw new i(400,"User name is required")};var xr=g(e=>{e.route({method:"post",url:"/",config:{isPublic:!0},handler:async t=>{if(!await B())throw new i(400,"Setup has already been completed");let o=y(t,Dr);return await Ar(o),{data:!0}}})});var $o=[[Pr,"/"],[ct,"/api/auth"],[Bt,"/api/data-sources"],[$t,"/api/project"],[Wt,"/api/queries"],[Tr,"/api/runner"],[gr,"/api/status"],[hr,"/api/teams"],[wr,"/api/users"],[Sr,"/api/user-settings"],[br,"/api/saved-queries"],[Ir,"/api/workbench-tabs"],[xr,"/api/setup"]],vr=e=>{for(let[t,r]of $o)e.register(t,{prefix:r}),console.log("Registered "+r)};var Wo=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),Ho=async()=>N.findOne({where:{role:"owner"},relations:{user:!0,team:!0}}),Yo=async e=>{let t=await Ho();if(!t)throw new i(401,"User is not part of a team");e.user={id:t.user.id,currentTeamId:t.team.id,currentTeamRole:t.role}},Go=async e=>{let t=e.headers.authorization;if(!t)throw new i(401,"Missing auth token");let[r,o]=t.split(" "),{userId:a}=await nt(o),n=await S.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}},_r=async e=>{Wo(e)||(D.skipAuth?await Yo(e):await Go(e))};var Ur=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Lr=e=>{e.addHook("onRequest",_r),e.addHook("onRequest",Ft),e.addHook("onResponse",Ur)};var qr=e=>{e.setNotFoundHandler((t,r)=>{if(t.raw.url?.startsWith("/api/")){r.code(404).send({error:"API route not found"});return}r.sendFile("index.html")}),e.setErrorHandler((t,r,o)=>{console.error(t),t instanceof i?o.status(t.status).send({error:t.message}):o.status(500).send({error:"Internal Server Error"})})};var kr=P(require("@fastify/cookie")),Mr=P(require("@fastify/cors"));var Qr=P(require("@fastify/static")),Fr=require("node:path"),Br=e=>{e.register(kr.default,{}),e.register(Mr.default,{origin:G.allowedOrigins,methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),e.register(Qr.default,{root:(0,Fr.join)(__dirname,"web")})};(async function(){let t=(0,$r.default)({querystringParser:o=>Wr.default.parse(o)});if(Me(),Br(t),Lr(t),vr(t),qr(t),await t.after(),await Xe(),t.listen({port:G.port,host:G.host},(o,a)=>{o&&(console.error(o),process.exit(1)),console.log(`Server listening at ${a}`)}),await B()){let o=Or();console.log(`Setup access token:
|
|
57
|
+
limit 75;`;return(await t.query(r)).rows.reduce((a,n)=>(a[n.row_key]={table:n.relname,column:n.attname},a),{})},yt=async(e,t,r,o)=>{try{console.log(`[PG CONN] Query: ${e}`),console.log(`[PG CONN] Params: ${JSON.stringify(t,null,2)}`);let{rows:a,fields:n,command:s,rowCount:u}=await r.query({text:e,rowMode:"array",values:t});if(s==="UPDATE"||s==="INSERT"||s==="DELETE"){if(u!=null&&u>1&&o.allowBulkUpdate!==!0)throw new Error("[PG CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[u]],query:e}}if(s==="SELECT"){let c=n.map(p=>`'${p.tableID}-${p.columnID}'`),m=await ho(c,r);return{columns:n.map(p=>{let f=m[`${p.tableID}-${p.columnID}`];return{column:f?.column||p.name,alias:p.name,table:f?.table||"",full:f?f.table+"."+f.column:p.name}}),rows:a,query:e}}throw new Error(`[PG CONN] Unsupported command: ${s}`)}catch(a){throw a instanceof i?a:new i(400,a.message)}},wo=async(e,t)=>{await e.query("BEGIN");try{let r=await t();return await e.query("COMMIT"),console.log("[PG CONN] Commit"),r}catch(r){throw await e.query("ROLLBACK"),console.log("[PG CONN] Rollback"),r}},So=async(e,t)=>{await e.query("BEGIN READ ONLY");try{let r=await t();return console.log("[PG CONN] Read only rollback"),await e.query("ROLLBACK"),r}catch(r){throw console.log("[PG CONN] Rollback"),await e.query("ROLLBACK"),r}},gt=async e=>{let t=await fo(e),r=!1,o=!1,a=async n=>(o||await t.query(`SET search_path TO ${e.schema}`),n());return{dbType:"postgres",dataSource:e,inspectSchema:()=>go(e,t),executeQuery:n=>a(()=>n.type==="SELECT"?So(t,()=>yt(n.sql,n.params,t,n)):wo(t,()=>yt(n.sql,n.params,t,n))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.end()}}};var M=async(e,t,r)=>{try{let o;if(t==="mysql")o=await ft(e);else if(t==="postgres")o=await gt(e);else throw new i(500,`Connection manager for ${t} not found`);return r.__connections?r.__connections.push(o):r.__connections=[o],o}catch(o){throw console.error(o),o instanceof i?o:o?.code==="ECONNREFUSED"?new i(500,"Failed to connect to the database"):new i(500,o.message)}};var ae=P(require("node:crypto"));var ht="aes-256-gcm",bo=12,wt=()=>{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},Eo=e=>{let t=ae.default.randomBytes(bo),r=wt(),o=ae.default.createCipheriv(ht,r,t),a=o.update(e,"utf8","hex");a+=o.final("hex");let n=o.getAuthTag();return{encrypted:a,iv:t.toString("hex"),tag:n.toString("hex")}},Io=({encrypted:e,iv:t,tag:r})=>{let o=wt(),a=ae.default.createDecipheriv(ht,o,Buffer.from(t,"hex"));a.setAuthTag(Buffer.from(r,"hex"));let n=a.update(e,"hex","utf8");return n+=a.final("utf8"),n},ne={encrypt:Eo,decrypt:Io};var Q=(e,t=!1)=>{if(t){let r=ne.decrypt({encrypted:e.dbPassword,tag:e.dbPasswordTag,iv:e.dbPasswordIv});return{url:e.dbUrl,user:e.dbUser,database:e.dbDatabase,password:r,port:e.dbPort,schema:e.dbSchema}}return{url:e.dbUrl,user:e.dbUser,database:e.dbDatabase,password:e.dbPassword,port:e.dbPort,schema:e.dbSchema}};var St=[{value:"=",label:"equals"},{value:"<>",label:"not equal"},{value:">",label:"greater than"},{value:">=",label:"greater than or equal"},{value:"<",label:"less than"},{value:"<=",label:"less than or equal"},{value:"LIKE",label:"like"},{value:"NOT LIKE",label:"not like"},{value:"CONTAINS",label:"contains"},{value:"NOT CONTAINS",label:"not contains"},{value:"IN",label:"in list"},{value:"NOT IN",label:"not in list"},{value:"IS NULL",label:"is null"},{value:"IS NOT NULL",label:"is not null"}],Ro=St.reduce((e,t)=>(e[t.value]=t.label,e),{}),jn=St.reduce((e,t)=>(e[t.label]=t.value,e),{}),W=e=>e.map(t=>({label:Ro[t],value:t})),Kn=W(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),Vn=W(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL","CONTAINS","NOT CONTAINS"]),zn=W(["=","<>","IS NULL","IS NOT NULL"]),Jn=W(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),Xn=W(["IS NULL","IS NOT NULL"]),Zn=W(["IN","NOT IN"]),Co=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"],No=new Set(Co),se=e=>No.has(e),Oo=["integer","smallint","decimal","numeric","float","real","double precision","int","smallint","integer","bigint","decimal","numeric","real","double precision","serial","bigserial","money"],Ao=new Set(Oo),bt=e=>Ao.has(e);var es=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var Oe={read_only:10,editor:20,admin:30,owner:40};var A=e=>e.startsWith("'")&&e.endsWith("'")||e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e;var Et={operator:"LIKE",parse:e=>{let t=e.match(/^LIKE\s*["'](.*)["']$/i);if(t)return[{value:A(t[1])}]},stringify:e=>`LIKE "%${e[0]?.value}%"`},It={operator:"NOT LIKE",parse:e=>{let t=e.match(/^NOT LIKE\s*["'](.*)["']$/i);if(t)return[{value:A(t[1])}]},stringify:e=>`NOT LIKE "%${e[0]?.value}%"`},Rt={operator:"CONTAINS",parse:e=>{let t=e.match(/^CONTAINS\s*["'](.*)["']$/i);if(t)return[{value:A(t[1])}]},stringify:(e,t)=>se(t)?`${e[0]?.value}`:`CONTAINS "%${e[0]?.value}%"`},Ct={operator:"NOT CONTAINS",parse:e=>{let t=e.match(/^NOT CONTAINS\s*["'](.*)["']$/i);if(t)return[{value:A(t[1])}]},stringify:e=>`NOT CONTAINS "%${e[0]?.value}%"`};function Ot(e){return e===""?[]:Po(e).map(Do)}function Po(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 Do(e){if(e.startsWith("'")&&e.endsWith("'"))return{value:Nt(e.slice(1,-1),"'")};if(e.startsWith('"')&&e.endsWith('"'))return{value:Nt(e.slice(1,-1),'"')};let t=Number(e);if(!Number.isNaN(t))return{value:t};throw new Error(`Invalid literal: ${e}`)}function Nt(e,t){return e.replace(/\\(.)/g,(r,o)=>o)}var At={operator:"IN",parse:e=>{let t=e.match(/^in\s*\((.*)\)$/i);if(t)return Ot(t[1])},stringify:e=>`IN (${e?.map(t=>`"${t.value}"`).join(", ")})`},Pt={operator:"NOT IN",parse:e=>{let t=e.match(/^not\s+in\s*\((.*)\)$/i);if(t)return Ot(t[1])},stringify:e=>`NOT IN (${e?.map(t=>`"${t.value}"`).join(", ")})`};var Dt={operator:"=",parse:e=>{let t=e.match(/^=\s*(.*)$/);if(t)return[{value:A(t[1])}]},stringify:(e,t)=>bt(t)?`${e[0]?.value}`:`= ${e[0]?.value}`},xt={operator:"!=",parse:e=>{let t=e.match(/^!=\s*(.*)$/);if(t)return[{value:A(t[1])}]},stringify:e=>`!= ${e[0]?.value}`},vt={operator:"<>",parse:e=>{let t=e.match(/^<>\s*(.*)$/);if(t)return[{value:A(t[1])}]},stringify:e=>`<> ${e[0]?.value}`},_t={operator:">",parse:e=>{let t=e.match(/^>\s*(.*)$/);if(t)return[{value:A(t[1])}]},stringify:e=>`> ${e[0]?.value}`},Ut={operator:">=",parse:e=>{let t=e.match(/^>=\s*(.*)$/);if(t)return[{value:A(t[1])}]},stringify:e=>`>= ${e[0]?.value}`},Lt={operator:"<",parse:e=>{let t=e.match(/^<\s*(.*)$/);if(t)return[{value:A(t[1])}]},stringify:e=>`< ${e[0]?.value}`},qt={operator:"<=",parse:e=>{let t=e.match(/^<=\s*(.*)$/);if(t)return[{value:A(t[1])}]},stringify:e=>`<= ${e[0]?.value}`};var kt={operator:"IS NULL",parse:e=>{if(/^is\s+null$/i.test(e))return[]},stringify:()=>"IS NULL"},Mt={operator:"IS NOT NULL",parse:e=>{if(/^is\s+not\s+null$/i.test(e))return[]},stringify:()=>"IS NOT NULL"};var xo=[Et,Rt,It,Ct,At,Pt,Dt,xt,vt,Ut,_t,qt,Lt,kt,Mt];function vo(e){let t=e.trim();for(let r of xo){let o=r.parse(t);if(o)return{operator:r.operator,value:o}}}var Qt={parse:vo};var b=e=>{let t=Oe[e];return r=>Oe[r.currentTeamRole]>=t},Ft=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 Bt=g(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=d(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}=U(t);return{data:await E.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",config:{requireRole:b("admin")},handler:async t=>{let{teamId:r,ownerId:o,...a}=y(t,mt),n=E.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),s=await M(Q(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:m}=ne.encrypt(n.dbPassword);return n.dbPassword=m,n.dbPasswordIv=c,n.dbPasswordTag=u,{data:await E.save(n)}}}),e.route({method:"put",url:"/:id",config:{requireRole:b("admin")},handler:async t=>{let{id:r}=d(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:b("admin")},handler:async(t,r)=>w.transaction(async()=>{let{id:o}=d(t);await Promise.all([v.delete({datasource:{id:o}}),I.delete({dataSource:{id:o}})]),await E.delete({id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=d(t),a=await E.findOne({where:{id:o},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]});if(!a)throw new Error("Data source not found");a.status="INSPECTING",await E.save(a);let s=await(await M(Q(a,!0),a.dbType,t)).inspectSchema();await v.delete({datasource:{id:o}}),await v.insert(s.sort().map(u=>v.create({tableName:u.tableName,columns:u.columns,datasource:{id:o}}))),a.status="READY",a.lastInspected=new Date,await E.save(a)}}),e.route({method:"get",url:"/:id/inspections",handler:async t=>{let{id:r}=d(t);return{data:await v.find({where:{datasource:{id:r}}})}}})});var L=require("typeorm"),$t=g(e=>{e.route({method:"get",url:"/team/:teamId/datasources",handler:async t=>{let{teamId:r}=d(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=d(t),o=U(t),a=r.teamId||t.user.currentTeamId,n=Number(o.size)||20,s=Number(o.page)||0,u=o.nameFilter?.length?{name:(0,L.Raw)(f=>`LOWER(${f}) LIKE :search`,{search:`%${o.nameFilter.toLowerCase()}%`})}:void 0,c=await _.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"}}}),m=c.length>n;return m&&c.pop(),{data:c.map(f=>({name:f.query.name,id:f.query.id,updatedAt:f.query.updatedAt,savedQueryId:f.id,datasourceName:f.query.dataSource.name,datasourceType:f.query.dataSource.dbType})),hasMore:m}}}),e.route({method:"get",url:"/team/:teamId/count-saved-queries",handler:async t=>{let o=d(t).teamId||t.user.currentTeamId;return{data:await _.count({where:[{isPersonal:!1,team:{id:o}},{isPersonal:!0,team:{id:o},user:{id:t.user.id}}],select:{id:!0}})}}}),e.route({method:"get",url:"/team/:teamId/query",handler:async t=>{let{teamId:r}=d(t),{search:o,size:a,selectedDataSources:n}=U(t),s=o.length>3?parseInt(a)||20:8,u={};n?.length&&(u.id=(0,L.In)(n));let[c,m,p]=await Promise.all([v.find({where:{tableName:(0,L.Raw)(l=>`LOWER(${l}) LIKE :search`,{search:`%${o.toLowerCase()}%`}),datasource:u},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:s}),O.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:"ASC"},take:s}),_.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:"ASC"},take:s})]),f=[];return c.forEach(l=>{f.push({name:l.tableName,id:l.id,dataSourceName:l.datasource?.name||"--",dataSourceId:l.datasource?.id||"--",type:"table"})}),m.forEach(l=>{f.push({name:l.name,id:l.id,dataSourceName:l.dataSource?.name||"--",dataSourceId:l.dataSource?.id||"--",type:"tab"})}),p.forEach(l=>{f.push({name:l.query.name,id:l.query.id,dataSourceName:l.query.dataSource?.name||"--",dataSourceId:l.query.dataSource?.id||"--",type:"query"})}),{data:f}}}),e.route({method:"get",url:"/team/:teamId/tabs-history",handler:async t=>{let{teamId:r}=d(t),o=U(t),a=Number(o.page),n=Number(o.size),s=t.user.id,u={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 O.find({where:u,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(p=>({name:p.name,id:p.id,updatedAt:p.updatedAt,archived:p.archived,createdAt:p.createdAt,dataSourceId:p.dataSource?.id,dataSourceName:p.dataSource?.name,dataSourceType:p.dataSource?.dbType})),hasMore:m}}})});var Wt=g(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=d(t),o=await I.findOne({where:{id:r},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return o?{data:o}:{status:404,data:"Query not found"}}}),e.route({method:"post",url:"/",config:{requireRole:b("editor")},handler:async t=>{let r=y(t),o=await E.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await I.save(I.create({name:r.name,opts:r.opts,team:{id:o?.team.id},dataSource:{id:r.dataSourceId},user:{id:t.user.id}}))}}}),e.route({method:"patch",url:"/:id",config:{requireRole:b("editor")},handler:async t=>{let{id:r}=d(t),o=y(t);if(!(await I.update(r,o)).affected)throw new i(404,"Query not found");return{data:await I.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",config:{requireRole:b("editor")},handler:async t=>w.transaction(async()=>{let{id:r}=d(t);if(!(await I.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var Ht=e=>se(e)?"CONTAINS":"=",Pe=(e,t)=>{let r=[];for(let o of e)if(!(!o.column?.length||!o.value?.length||o.isEnabled===!1))if(o.isAdvanced){let a=Qt.parse(o.value);if(!a)throw new i(400,`Invalid value for '${o.column}': ${o.value}`);r.push({value:a.value,column:o.column,operator:a.operator||Ht(t(o.column)),fn:o.fn})}else r.push({value:o.value?[{value:o.value}]:[],column:o.column,operator:Ht(t(o.column)),fn:o.fn});return r},Yt=e=>{let t=[e.table];return e.joins&&e.joins.forEach(({table:r})=>t.push(r)),t},Ae=e=>({column:e.value,fn:e.fn,distinct:e.distinct}),Gt=(e,t,r)=>{let o=[];return t.length>0||r.length>0?o.push(...t.map(Ae),...r.map(Ae)):e.length>0&&o.push(...e.map(Ae)),o},jt=(e,t,r)=>t.map((o,a)=>({...o,full:e[a].fn?e[a].column:o.full,type:r(o.full),fn:e[a].fn}));var De=require("typeorm"),Kt=new De.DataSource({type:"mysql"}),Vt=new De.DataSource({type:"postgres"}),H=e=>{switch(e){case"postgres":return Vt.createQueryBuilder();case"mysql":return Kt.createQueryBuilder();default:throw new Error("Unsupported database connection")}},ie={postgres:Vt.driver,mysql:Kt.driver};var V=(e,t,r)=>{let{column:o,operator:a,value:n}=e,s="_"+t;switch(a){case"IS NULL":case"IS NOT NULL":return[`${o} ${a}`,{value:void 0}];case"IN":case"NOT IN":return[`${o} ${a} (:...${s})`,{[s]:n?.map(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 zt=e=>{let t=ie[e];return r=>{if(r.includes(".")){let[o,a]=r.split(".");return t.escape(o)+"."+t.escape(a)}return r==="*"?r:t.escape(r)}};var Jt=["SUM","COUNT","AVG","MAX","MIN"],_o=["YEAR","MONTH","DAY",...Jt],Uo=_o.reduce((e,t)=>(e[t]=!0,e),{}),Lo=Jt.reduce((e,t)=>(e[t]=!0,e),{}),Xt=e=>Uo[e],Zt=e=>Lo[e];var ue=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,er={YEAR:e=>`EXTRACT(YEAR FROM ${e})`,MONTH:e=>`EXTRACT(MONTH FROM ${e})`,DAY:e=>`EXTRACT(DAY FROM ${e})`,SUM:(e,t,r)=>r?`COALESCE(SUM(distinct ${e}), 0)`:`COALESCE(SUM(${e}), 0)`,AVG:ue,MAX:ue,MIN:ue,COUNT:ue};var ce=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,tr={YEAR:e=>`YEAR(${e})`,MONTH:e=>`MONTH(${e})`,DAY:e=>`DAY(${e})`,SUM:(e,t,r)=>r?`coalesce(${t}(distinct ${e}), 0)`:`coalesce(${t}(${e}), 0)`,AVG:ce,MAX:ce,MIN:ce,COUNT:ce};var qo=e=>{let t=[];return e.fn&&t.push(e.fn),e.distinct&&t.push("distinct"),t.push(e.column),t.join(" ")},ko=e=>{let t=zt(e),r=e==="postgres"?er:tr;return o=>o.fn&&Xt(o.fn)?r[o.fn](t(o.column),o.fn,o.distinct):t(o.column)};function rr(e,t){let r=H(t.dbType).from(e,e),o=!1,a=0,n=ko(t.dbType),s={};return{setColumns(u){u.forEach(c=>{let m=qo(c);s[m]=m,r.addSelect(n(c),m)})},setLimit:u=>{r.limit(u),o=!0},setOffset(u){r.skip(u)},addOrderBy(u,c){r.addOrderBy(u,c)},addJoin({table:u,alias:c,on:m}){r.leftJoin(u,c||u,m)},addWhere(u){let[c,m]=V({...u,operator:u.operator||"=",column:n(u)},++a,t.dbType);r.andWhere(c,m)},addHaving(u){let[c,m]=V({...u,operator:u.operator||"=",column:n(u)},++a,t.dbType);r.andHaving(c,m)},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 or=(e,t)=>{let r=H(t.dbType).update(e),o=0;return{addWhere(a){let[n,s]=V(a,++o,t.dbType);r.andWhere(n,s)},setParams(a){let n={};for(let[s,u]of Object.entries(a)){let c=`${u}`;c.startsWith("=")?n[s]=()=>c.substring(1):n[s]=c}r.set(n)},build(){let[a,n]=r.getQueryAndParameters();return{sql:a,params:n}}}};var ar=(e,t)=>{let r=H(t.dbType).insert().into(e);return{setValues(o){let a={};for(let[n,s]of Object.entries(o)){let u=`${s}`;u.startsWith("=")?a[n]=()=>u.substring(1):a[n]=u}r.values([a])},build(){let[o,a]=r.getQueryAndParameters();return{sql:o,params:a}}}};var xe=rr,nr=or,sr=ar;var ir=require("typeorm"),ur=async(e,t)=>{let r=await v.find({where:{tableName:(0,ir.In)(t),datasource:{id:e}}}),o=[];for(let s of r)if(s.columns)for(let u of s.columns)o.push({column:u.name,table:s.tableName||"",full:`${s.tableName}.${u.name}`,type:u.type});let a=o.reduce((s,u)=>(s[u.full]=u.type,s),{});return{getAllColumns(){return o},getColumnType:s=>a[s],hasColumn(s){return!!a[s]||s==="*"}}};async function Mo(e,t,r){return I.save(I.create({user:{id:e},team:{id:t},dataSource:{id:r.datasourceId},name:r.name,opts:r.opts}))}var me=async(e,t)=>{let{datasourceId:r,size:o=20,page:a}=t,{table:n,joins:s,groupBy:u,orderBy:c}=t.opts,m=await le(r);if(!m)throw new i(404,"Datasource not found");let p=Gt(t.opts.columns,t.opts.groupBy,t.opts.aggregations),f=Yt(t.opts),l=await ur(r,f),C=l.getAllColumns(),q;p&&p.length>0?q=p:q=C.map(R=>({column:R.full})),q.forEach(R=>{if(!l.hasColumn(R.column))throw new i(400,`Invalid column ${R.column}`)});let Hr=Mo(e.user.id,e.user.currentTeamId,t),x=xe(n,m);x.setLimit(o+1),x.setOffset(o*a),x.setColumns(q),s&&s.forEach(x.addJoin),c.length>0&&c.forEach(({column:R,direction:Kr})=>{x.hasAlias(R)&&x.addOrderBy(ie[m.dbType].escape(R),Kr)}),u&&u.length>0&&u.forEach(R=>{l.hasColumn(R.value)&&x.addGroupBy({column:R.value,fn:R.fn,distinct:R.distinct})}),Pe(t.opts.filters,l.getColumnType).forEach(R=>{R.fn&&Zt(R.fn)?x.addHaving(R):x.addWhere(R)});let{sql:Yr,params:Gr}=x.build(),J=await(await M(Q(m,!0),m.dbType,e)).executeQuery({sql:Yr,params:Gr,type:"SELECT",allowBulkUpdate:!1}),_e=J.rows.length>o;_e&&J.rows.pop();let{id:jr}=await Hr;return{...J,queryHistoryId:jr,tables:f,allColumns:C,columns:jt(q,J.columns,l.getColumnType),hasMore:_e}},cr=async(e,t)=>{let r=await le(t.dataSourceId);if(!r)throw new i(400,"Invalid datasource");let o=await M(Q(r,!0),r.dbType,e),a=xe(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:s}=a.build(),u=await o.executeQuery({sql:n,params:s,type:"SELECT",allowBulkUpdate:!1});if(u.rows.length>1)throw new i(400,"Found multiple rows for given query");if(u.rows.length<1)throw new i(404,"Entity not found");return{entity:u.rows[0],columns:u.columns,sql:n}},mr=async(e,t)=>{let r=await le(t.datasourceId);if(!r)throw new i(404,"Data source not found");if(!r.allowUpdate)throw new i(403,"This datasource does not allow update operations");let o=nr(t.table,r);o.setParams(t.values),Pe(t.filters,()=>"=").forEach(u=>{o.addWhere(u)});let{sql:a,params:n}=o.build();return(await M(Q(r,!0),r.dbType,e)).executeQuery({sql:a,params:n,type:"UPDATE",allowBulkUpdate:!1})},lr=async(e,t)=>{let r=await le(t.datasourceId);if(!r)throw new i(404,"Data source not found");if(!r.allowInsert)throw new i(403,"This datasource does not allow insert operations");let o=sr(t.table,r);o.setValues(t.values);let{sql:a,params:n}=o.build();return(await M(Q(r,!0),r.dbType,e)).executeQuery({sql:a,type:"INSERT",params:n,allowBulkUpdate:!1})};async function le(e){return E.findOne({where:{id:e},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowUpdate","allowInsert"]})}var dr=e=>{},Qo=["--",";","DROP","drop"],pr=([e,t])=>{if(typeof t=="string"&&t.startsWith("=")){let r=t;Qo.forEach(o=>{if(r.includes(o))throw new i(400,"Invalid input value for "+e)})}},fr=e=>{if(!e.table)throw new i(400,"Table is required");Object.entries(e.values).forEach(pr)},yr=e=>{if(!e.table)throw new i(400,"Table is required");Object.entries(e.values).forEach(pr)};var Tr=g(e=>{e.route({method:"post",url:"/:dsId/select",handler:async t=>{let r=y(t,dr);return{data:await me(t,r)}}}),e.route({method:"get",url:"/:dsId/entity/:table",handler:async t=>{let{dsId:r,table:o}=d(t),a=U(t);return{data:await cr(t,{table:o,dataSourceId:r,props:a})}}}),e.route({method:"post",url:"/:dsId/insert",config:{requireRole:b("editor")},handler:async t=>{let r=y(t,fr);return{data:await lr(t,r)}}}),e.route({method:"post",url:"/:dsId/update",config:{requireRole:b("editor")},handler:async t=>{let r=y(t,yr);return{data:await mr(t,r)}}})});var gr=g(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:T.str("SERVER_VERSION")}}))});var hr=g(e=>{e.route({method:"get",url:"/:id/users",handler:async t=>{let{id:r}=d(t),o=await k.findOne({where:{id:r},relations:{users:{user:!0}}});if(!o)throw new 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:b("editor")},handler:async t=>w.transaction(async()=>{let r=t.user.id,o=y(t),a=S.create();a.id=r;let n=k.create(o);await k.save(n);let s=N.create({user:a,team:n});return await N.save(s),{data:n}})}),e.route({method:"patch",url:"/:id/user-role",config:{requireRole:b("admin")},handler:async t=>{let{id:r}=d(t),{role:o,userId:a}=y(t,({role:s})=>{if(s==="owner")throw new i(400,"Only one owner is allowed")});if((await N.findOneBy({user:{id:a},team:{id:r}}))?.role==="owner")throw new i(400,"Cannot change owner role");await N.update({user:{id:a},team:{id:r}},{role:o})}}),e.route({method:"delete",url:"/:id",config:{requireRole:b("admin")},handler:async t=>w.transaction(async()=>{let{id:r}=d(t),{userId:o}=U(t);if((await N.findOneBy({user:{id:o},team:{id:r}}))?.role==="owner")throw new i(400,"Cannot delete team owner");await S.update(o,{currentTeam:null}),await N.delete({user:{id:o},team:{id:r}}),await S.delete({id:o})})})});var ve=P(require("bcryptjs")),z=async e=>{let t=await ve.default.genSalt(10);return ve.default.hash(e,t)};var wr=g(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=await S.findOne({where:{id:t.user.id},relations:{currentTeam:{team:!0}}});if(!r)throw new 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 z(o.password)),!(await S.update(r,o)).affected)throw new i(404,"User not found");let n=await S.findOne({where:{id:r},relations:{currentTeam:{team:!0}}});return{data:{id:n?.id,teamId:n?.currentTeam?.team.id,teamName:n?.currentTeam?.team.name,teamRole:n?.currentTeam?.role,username:n?.username}}}}),e.route({method:"post",url:"/",config:{requireRole:b("admin")},handler:async t=>w.transaction(async()=>{let r=y(t),o=await z(r.password),a=await S.save(S.create({username:r.username,password:o})),n=await N.save(N.create({role:"read_only",team:{id:r.teamId},user:{id:a.id}}));await S.update(a.id,{currentTeam:{id:n.id}})})})});var Sr=g(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=t.user.id,o=await $.findOneBy({user:{id:r}});return o||(o=await $.save($.create({user:{id:r}}))),{data:o}}}),e.route({method:"patch",url:"/",handler:async t=>{let{settings:r}=y(t);if(!r.id)throw new i(400,"Settings id is required!");if(!(await $.update(r.id,r)).affected)throw new i(404,"You do not own these settings!");return{data:await $.findOneBy({id:r.id})}}})});function Y(e,...t){let r=[...t];if(e.searchAll&&r.push(e.searchAll),e.filters)for(let o of e.filters)o.value&&r.push(o.value);return r.map(o=>o.toLowerCase()).join(",")}var br=g(e=>{e.route({method:"post",url:"/",config:{requireRole:b("editor")},handler:async t=>{let r=y(t),o=await I.findOne({where:{id:r.queryId}});if(!o)throw new i(400,"Query not found");let a=await _.save(_.create({isPersonal:!1,team:{id:t.user.currentTeamId},user:{id:t.user.id},query:{id:r.queryId},searchString:Y(o.opts,r.name)}));return await I.update(r.queryId,{name:r.name}),{data:a}}}),e.route({method:"delete",url:"/:id",config:{requireRole:b("editor")},handler:async t=>{let{id:r}=d(t);if(!(await _.delete({id:r})).affected)return{status:404,data:"Query not found"}}}),e.route({method:"patch",url:"/:id",handler:async t=>await w.transaction(async()=>{let{id:r}=d(t),o=y(t,s=>{if(!s.name)throw new i(400,"Name is required")}),a=await _.findOne({where:{id:r},relations:{query:!0}});if(!a)throw new i(400,"Query not found");let n=Y(a.query.opts,o.name);return await Promise.all([_.update({id:r},{searchString:n}),I.update({id:a.query.id},{name:o.name})]),{data:!0}})})});var Er=e=>{if(!e.queryId&&!(e.opts&&e.name))throw new i(400,"Either queryId or name and opts are required")};var Ir=g(e=>{e.route({method:"get",url:"/",handler:async t=>{let{currentTeamId:r,id:o}=t.user;return{data:(await O.find({where:{team:{id:r},user:{id:o},archived:!1},select:["id","name"]})).map(n=>({name:n.name,id:n.id}))}}}),e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=d(t),{currentTeamId:o,id:a}=t.user,n=await O.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,Er),n,s,u=o;if(r)s=r.dataSourceId,n=r;else{let m=await I.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,columns:m.opts.columns,groupBy:m.opts.groupBy,searchAll:m.opts.searchAll,aggregations:m.opts.aggregations,dataSourceId:m.dataSource.id,page:0,size:50},o||(u=m.name)}return{data:await O.save(O.create({name:u||new Date().toISOString(),opts:n||{},dataSource:{id:s},user:{id:t.user.id},team:{id:t.user.currentTeamId}}))}}}),e.route({method:"post",url:"/:id/run",handler:async t=>{let{id:r}=d(t),o=y(t),a=await O.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&&O.update(r,{opts:o||{},searchString:Y(o,a.name),updatedAt:new Date}),{data:{result:await me(t,{datasourceId:o.dataSourceId,size:o.size,name:a.name,page:o.page,opts:{table:o.table,filters:o.filters,joins:o.joins,orderBy:o.orderBy,columns:o.columns,groupBy:o.groupBy,searchAll:o.searchAll,aggregations:o.aggregations}})}}}}),e.route({method:"patch",url:"/:id",handler:async t=>{let{id:r}=d(t),o=y(t),a=await O.findOne({where:{id:r,user:{id:t.user.id}}});if(!a)throw new i(404,"Not Found");let n=a.searchString;return o.name&&(n=Y(a.opts,o.name)),await O.update(r,{...o,searchString:n}),{data:{id:r}}}}),e.route({method:"delete",url:"/:id",handler:async t=>{let{id:r}=d(t),o=t.user.id;return await O.delete({id:r,user:{id:o}}),{data:!0}}})});var Nr=require("node:crypto");var Rr=require("node:crypto"),Cr={teamName:"Default Team",username:"admin"},Fo=async()=>{let e=await k.findOneBy({});return e||k.save(k.create({name:Cr.teamName}))},de=async e=>{let t=await N.findOne({where:{role:"owner"},relations:{user:!0}});if(t)return t.user;let r=await Fo(),o=await z(e?.password||(0,Rr.randomBytes)(32).toString("hex")),a=await S.save(S.create({username:e?.name||Cr.username,password:o})),n=await N.save(N.create({user:a,team:r,role:"owner"}));return await S.update(a.id,{currentTeam:n}),a};var pe={setupAccessToken:void 0},Or=()=>(pe.setupAccessToken=(0,Nr.randomBytes)(32).toString("hex"),pe.setupAccessToken),Bo=e=>{if(!pe.setupAccessToken)throw new i(400,"Setup already performed");if(!e||e!==pe.setupAccessToken)throw new i(400,"Invalid setup access token")},B=async()=>D.skipAuth?!1:await S.count()<1,Ar=async e=>{Bo(e.setupAccessToken),await de({name:e.userName,password:e.userPassword})};var Pr=g(e=>{e.route({method:"get",url:"/client.config.js",handler:(t,r)=>{let o={skipAuth:D.skipAuth,modeName:D.name,usesCustomDb:Qe(),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 B()?r.redirect("/setup"):r.sendFile("index.html")}),e.route({method:"get",url:"/setup",handler:async(t,r)=>await B()?r.sendFile("setup.html"):r.redirect("/")})});var Dr=e=>{if(!e.setupAccessToken)throw new i(400,"Invalid setup access token");if(!e.userPassword||e.userPassword.length<8)throw new i(400,"Password should be at least 8 chars long");if(!e.userName)throw new i(400,"User name is required")};var xr=g(e=>{e.route({method:"post",url:"/",config:{isPublic:!0},handler:async t=>{if(!await B())throw new i(400,"Setup has already been completed");let o=y(t,Dr);return await Ar(o),{data:!0}}})});var $o=[[Pr,"/"],[ct,"/api/auth"],[Bt,"/api/data-sources"],[$t,"/api/project"],[Wt,"/api/queries"],[Tr,"/api/runner"],[gr,"/api/status"],[hr,"/api/teams"],[wr,"/api/users"],[Sr,"/api/user-settings"],[br,"/api/saved-queries"],[Ir,"/api/workbench-tabs"],[xr,"/api/setup"]],vr=e=>{for(let[t,r]of $o)e.register(t,{prefix:r}),console.log("Registered "+r)};var Wo=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),Ho=async()=>N.findOne({where:{role:"owner"},relations:{user:!0,team:!0}}),Yo=async e=>{let t=await Ho();if(!t)throw new i(401,"User is not part of a team");e.user={id:t.user.id,currentTeamId:t.team.id,currentTeamRole:t.role}},Go=async e=>{let t=e.headers.authorization;if(!t)throw new i(401,"Missing auth token");let[r,o]=t.split(" "),{userId:a}=await nt(o),n=await S.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}},_r=async e=>{Wo(e)||(D.skipAuth?await Yo(e):await Go(e))};var Ur=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Lr=e=>{e.addHook("onRequest",_r),e.addHook("onRequest",Ft),e.addHook("onResponse",Ur)};var qr=e=>{e.setNotFoundHandler((t,r)=>{if(t.raw.url?.startsWith("/api/")){r.code(404).send({error:"API route not found"});return}r.sendFile("index.html")}),e.setErrorHandler((t,r,o)=>{console.error(t),t instanceof i?o.status(t.status).send({error:t.message}):o.status(500).send({error:"Internal Server Error"})})};var kr=P(require("@fastify/cookie")),Mr=P(require("@fastify/cors"));var Qr=P(require("@fastify/static")),Fr=require("node:path"),Br=e=>{e.register(kr.default,{}),e.register(Mr.default,{origin:G.allowedOrigins,methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),e.register(Qr.default,{root:(0,Fr.join)(__dirname,"web")})};(async function(){let t=(0,$r.default)({querystringParser:o=>Wr.default.parse(o)});if(Me(),Br(t),Lr(t),vr(t),qr(t),await t.after(),await Xe(),t.listen({port:G.port,host:G.host},(o,a)=>{o&&(console.error(o),process.exit(1)),console.log(`Server listening at ${a}`)}),await B()){let o=Or();console.log(`Setup access token:
|
|
58
58
|
${o}`),console.log("Use the above token to finish the setup process when opening the app for the first time.")}else await de()})();
|
package/dist/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@dataramen/server","version":"0.0.
|
|
1
|
+
{"name":"@dataramen/server","version":"0.0.97","license":"MIT","main":"code/server.js","dependencies":{"@fastify/cors":"^11.0.1","@fastify/static":"^8.2.0","@fastify/cookie":"^11.0.2","dotenv":"^16.5.0","fast-glob":"^3.3.3","fastify":"^5.3.2","mysql2":"^3.14.1","pg":"^8.15.6","sqlite3":"^5.1.7","typeorm":"^0.3.27","bcryptjs":"^3.0.2","jose":"^6.0.12","reflect-metadata":"^0.2.2","qs":"^6.14.0"},"buildToken":"cbc481e12d2c1aa41db4","devDependencies":{"fs-extra":"^11.3.0","open":"^10.2.0","commander":"^14.0.2","yocto-spinner":"^1.0.0"}}
|