@dataramen/cli 0.0.84-beta.1 → 0.0.84-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/code/server.js +1 -1
- package/dist/code/web/assets/{index-4_2vea0v.js → index-D8gKTOYX.js} +10 -10
- package/dist/code/web/assets/index-l5Nfyosj.css +1 -0
- package/dist/code/web/assets/main-Chd7GySZ.css +1 -0
- package/dist/code/web/assets/main-Dyxn9IRv.js +4 -0
- package/dist/code/web/assets/{setup-CXjgdMcg.js → setup-MoGvdW5M.js} +1 -1
- package/dist/code/web/index.html +4 -4
- package/dist/code/web/setup.html +3 -3
- package/dist/package.json +1 -1
- package/package.json +1 -1
- package/dist/code/web/assets/index-CYeuDa9l.css +0 -1
- package/dist/code/web/assets/main-CqSmXK5U.css +0 -1
- package/dist/code/web/assets/main-XsccDsDS.js +0 -4
package/dist/code/server.js
CHANGED
|
@@ -58,5 +58,5 @@
|
|
|
58
58
|
SELECT id
|
|
59
59
|
FROM query
|
|
60
60
|
WHERE dataSourceId = :dataSourceId
|
|
61
|
-
)`).setParameter("dataSourceId",t).execute(),await e.delete(K,{dataSource:{id:t}})},ye=async(e,t)=>{let r=await e.find(q,{where:{datasource:{id:t}},select:["id"]});for(let o of r)await e.delete(M,{table:{id:o.id}}),await e.delete(q,o)};function Zo(e){let t=new Map;for(let r of e)r.columns?.forEach(o=>{if(o.ref){let a=`${o.ref.table}.${o.ref.field}`,n=t.get(a)||[];n.push({table:r.tableName,field:o.name}),t.set(a,n)}});return t}var Zt=async e=>{let t=await C.findOne({where:{id:e},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]});if(!t)throw new Error("Data source not found");return t.status="INSPECTING",await C.save(t),b.transaction(async r=>{let a=await(await Pt(k(t,!0),t.dbType)).inspectSchema();await ye(r,t.id);let n=Zo(a);for(let i of a){let s=await r.save(q,{datasource:{id:e},name:i.tableName});if(i.columns){let c=[];for(let m of i.columns)c.push(ce.create({table:{id:s.id},name:m.name,isPrimary:!!m.isPrimary,type:m.type,meta:{refs:m.ref,referencedBy:n.get(`${s.name}.${m.name}`)}}));await r.save(M,c)}}await r.save(F,{id:e,status:"READY",lastInspected:new Date})}).catch(r=>{console.error(r),C.save({id:e,status:"FAILED"})}),!0};var er=h(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=p(t),o=await C.findOne({where:{id:r}});if(!o)throw new u(404,"Data source not found");return{data:o}}}),e.route({method:"get",url:"/",handler:async t=>{let{teamId:r}=_(t);return{data:await C.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",config:{requireRole:I("admin")},handler:async t=>{let{teamId:r,ownerId:o,...a}=f(t,It),n=C.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),i=await $(k(n),n.dbType,t);try{await i.checkConnection()}catch{throw new u(400,"Cannot connect to the database, please check datasource configuration")}let{tag:s,iv:c,encrypted:m}=pe.encrypt(n.dbPassword);return n.dbPassword=m,n.dbPasswordIv=c,n.dbPasswordTag=s,{data:await C.save(n)}}}),e.route({method:"put",url:"/:id",config:{requireRole:I("admin")},handler:async t=>{let{id:r}=p(t),o=f(t),a=await C.findOneBy({id:r});if(!a)throw new u(404,"Data source not found");let n=C.merge(a,o);return await C.save(n),{data:n}}}),e.route({method:"delete",url:"/:id",config:{requireRole:I("admin")},handler:async t=>b.transaction(async r=>{let{id:o}=p(t);await r.delete(z,{dataSource:{id:o}}),await Xt(r,o),await ye(r,o),await r.delete(F,{id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=p(t);return{data:{started:await Zt(o)}}}}),e.route({method:"get",url:"/:id/inspections",handler:async t=>{let{id:r}=p(t);return{data:(await me.find({where:{datasource:{id:r}},relations:{columns:!0},order:{name:"ASC",columns:{isPrimary:"DESC",name:"ASC"}}})).map(n=>({tableName:n.name,id:n.id,updatedAt:n.updatedAt,createdAt:n.createdAt,columns:n.columns.map(i=>({name:i.name,type:i.type,isPrimary:i.isPrimary,ref:i.meta?.refs}))}))}}})});var L=require("typeorm"),tr=h(e=>{e.route({method:"get",url:"/team/:teamId/datasources",handler:async t=>{let{teamId:r}=p(t);return{data:await C.find({where:{team:{id:r}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0,dbType:!0,description:!0,allowInsert:!0,allowUpdate:!0}})}}}),e.route({method:"get",url:"/team/:teamId/queries",handler:async t=>{let r=p(t),o=_(t),a=r.teamId||t.user.currentTeamId,n=Number(o.size)||20,i=Number(o.page)||0,s=o.nameFilter?.length?{name:(0,L.Raw)(y=>`LOWER(${y}) LIKE :search`,{search:`%${o.nameFilter.toLowerCase()}%`})}:void 0,c=await U.find({where:[{isPersonal:!1,team:{id:a},query:s},{isPersonal:!0,team:{id:a},query:s,user:{id:t.user.id}}],relations:{query:{dataSource:!0}},take:n+1,skip:i*n,select:{id:!0,query:{id:!0,name:!0,updatedAt:!0,dataSource:{name:!0,dbType:!0}}},order:{query:{updatedAt:"DESC"}}}),m=c.length>n;return m&&c.pop(),{data:c.map(y=>({name:y.query.name,id:y.query.id,updatedAt:y.query.updatedAt,savedQueryId:y.id,datasourceName:y.query.dataSource.name,datasourceType:y.query.dataSource.dbType})),hasMore:m}}}),e.route({method:"get",url:"/team/:teamId/query",handler:async t=>{let{teamId:r}=p(t),{search:o,size:a,selectedDataSources:n}=_(t),i=o.length>3?parseInt(a)||20:8,s={};n?.length&&(s.id=(0,L.In)(n));let[c,m,l]=await Promise.all([me.find({where:{name:(0,L.Raw)(d=>`LOWER(${d}) LIKE :search`,{search:`%${o.toLowerCase()}%`}),datasource:s},relations:{datasource:!0},select:{id:!0,name:!0,datasource:{name:!0,id:!0}},order:{name:"ASC"},take:i}),S.find({where:{searchString:(0,L.Like)(`%${o.toLowerCase()}%`),team:{id:r},user:{id:t.user.id},dataSource:s},relations:{dataSource:!0},select:{id:!0,name:!0,updatedAt:!0,dataSource:{id:!0,name:!0}},order:{updatedAt:"DESC"},take:i}),U.find({where:{searchString:(0,L.Like)(`%${o.toLowerCase()}%`),team:{id:r},query:{dataSource:s}},relations:{query:{dataSource:!0}},select:{id:!0,updatedAt:!0,query:{id:!0,name:!0,dataSource:{name:!0}}},order:{updatedAt:"DESC"},take:i})]),y=[];return c.forEach(d=>{y.push({name:d.name,id:d.id,dataSourceName:d.datasource?.name||"--",dataSourceId:d.datasource?.id||"--",type:"table"})}),m.forEach(d=>{y.push({name:d.name,id:d.id,dataSourceName:d.dataSource?.name||"--",dataSourceId:d.dataSource?.id||"--",type:"tab"})}),l.forEach(d=>{y.push({name:d.query.name,id:d.query.id,dataSourceName:d.query.dataSource?.name||"--",dataSourceId:d.query.dataSource?.id||"--",type:"query"})}),{data:y}}}),e.route({method:"get",url:"/team/:teamId/tabs-history",handler:async t=>{let{teamId:r}=p(t),o=_(t),a=Number(o.page),n=Number(o.size),i=t.user.id,s={team:{id:r},user:{id:i}};o.nameFilter?.length&&(s.name=(0,L.Like)(`%${o.nameFilter}%`)),o.archived&&(s.archived=o.archived==="true");let c=await S.find({where:s,relations:{dataSource:!0},order:{updatedAt:"DESC"},take:n+1,skip:a*n}),m=!1;return c.length>n&&(c.pop(),m=!0),{data:c.map(l=>({name:l.name,id:l.id,updatedAt:l.updatedAt,archived:l.archived,createdAt:l.createdAt,dataSourceId:l.dataSource?.id,dataSourceName:l.dataSource?.name,dataSourceType:l.dataSource?.dbType})),hasMore:m}}})});var rr=h(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=p(t),o=await N.findOne({where:{id:r},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return o?{data:o}:{status:404,data:"Query not found"}}}),e.route({method:"post",url:"/",config:{requireRole:I("editor")},handler:async t=>{let r=f(t),o=await C.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await N.save(N.create({name:r.name,opts:r.opts,team:{id:o?.team.id},dataSource:{id:r.dataSourceId},user:{id:t.user.id}}))}}}),e.route({method:"patch",url:"/:id",config:{requireRole:I("editor")},handler:async t=>{let{id:r}=p(t),o=f(t);if(!(await N.update(r,o)).affected)throw new u(404,"Query not found");return{data:await N.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",config:{requireRole:I("editor")},handler:async t=>b.transaction(async()=>{let{id:r}=p(t);if(!(await N.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var or=e=>e&&fe(e)?"CONTAINS":"=",Le=(e,t)=>{let r=[];for(let o of e){if(!o.column?.length||!o.value?.length||o.isEnabled===!1)continue;let[a,n]=o.column.split("."),i=t(a,n);if(o.mode==="advanced"){let s=zt.parse(o.value);if(!s)throw new u(400,`Invalid value for '${o.column}': ${o.value}`);r.push({value:s.value,column:o.column,operator:s.operator||or(i?.type),fn:o.fn})}else o.mode==="raw"?r.push({value:o.value?[{value:o.value}]:[],column:o.column,operator:"RAW",fn:o.fn}):r.push({value:o.value?[{value:o.value}]:[],column:o.column,operator:or(i?.type),fn:o.fn})}return r},ar=e=>{let t=[e.table];return e.joins&&e.joins.forEach(({table:r})=>t.push(r)),t},ke=e=>({column:e.value,fn:e.fn,distinct:e.distinct}),nr=(e,t,r)=>{let o=[];return t.length>0||r.length>0?o.push(...t.map(ke),...r.map(ke)):e.length>0&&o.push(...e.map(ke)),o},ea=e=>e.isPrimary&&e.table?.name?{table:e.table.name,field:e.name}:e?.meta?.refs,ta=e=>e?.meta?.referencedBy,sr=(e,t,r)=>t.map((o,a)=>{let n=o.table?r(o.table,o.column):void 0,i=n?ea(n):void 0,s=n?ta(n):void 0;return{...o,full:e[a].fn?e[a].column:o.full,type:n?.type,fn:e[a].fn,hidden:e[a].hidden,ref:i,referencedBy:s}}),ir=e=>{let t=[],r=[];for(let o of e)o.referencedBy?.forEach(a=>{t.push({id:[a.table,a.field,o.table,o.column].join("."),fromColumn:a.field,fromTable:a.table,toColumn:o.column,toTable:o.table,direction:"in"})}),o.ref&&(r.push({id:[o.column,o.table,o.ref.table,o.ref.field].join("."),fromColumn:o.column,fromTable:o.table,toColumn:o.ref.field,toTable:o.ref.table,direction:"out"}),o.ref.table!==o.table&&t.push({id:[o.column,o.table,o.ref.table,o.ref.field].join("."),fromColumn:o.column,fromTable:o.table,toColumn:o.ref.field,toTable:o.ref.table,direction:"out"}));return{hooks:t,entities:r}};var qe=require("typeorm"),ur=new qe.DataSource({type:"mysql"}),cr=new qe.DataSource({type:"postgres"}),Y=e=>{switch(e){case"postgres":return cr.createQueryBuilder();case"mysql":return ur.createQueryBuilder();default:throw new Error("Unsupported database connection")}},Te={postgres:cr.driver,mysql:ur.driver};var ee=(e,t,r)=>{let{column:o,operator:a,value:n}=e,i="_"+t;switch(a){case"RAW":let s=" "+o+" ";return[`(${o} ${n[0].value.replace(/\s_\s/g,s)})`,{}];case"IS NULL":case"IS NOT NULL":return[`${o} ${a}`,{value:void 0}];case"IN":case"NOT IN":return[`${o} ${a} (:...${i})`,{[i]:n?.map(l=>l.value)}];case"LIKE":case"CONTAINS":return[`${o} ${r==="postgres"?"ILIKE":"LIKE"} :${i}`,{[i]:a==="CONTAINS"?`%${n?.[0].value}%`:n?.[0].value}];case"NOT LIKE":case"NOT CONTAINS":return[`${o} ${r==="postgres"?"NOT ILIKE":"NOT LIKE"} :${i}`,{[i]:a==="NOT CONTAINS"?`%${n?.[0].value}%`:n?.[0].value}];default:return[`${o} ${a} :${i}`,{[i]:n?.[0]?.value}]}};var mr=e=>{let t=Te[e];return r=>{if(r.includes(".")){let[o,a]=r.split(".");return t.escape(o)+"."+t.escape(a)}return r==="*"?r:t.escape(r)}};var lr=["SUM","COUNT","AVG","MAX","MIN"],ra=["YEAR","MONTH","DAY",...lr],oa=ra.reduce((e,t)=>(e[t]=!0,e),{}),aa=lr.reduce((e,t)=>(e[t]=!0,e),{}),dr=e=>oa[e],pr=e=>aa[e];var ge=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,fr={YEAR:e=>`EXTRACT(YEAR FROM ${e})`,MONTH:e=>`EXTRACT(MONTH FROM ${e})`,DAY:e=>`EXTRACT(DAY FROM ${e})`,SUM:(e,t,r)=>r?`COALESCE(SUM(distinct ${e}), 0)`:`COALESCE(SUM(${e}), 0)`,AVG:ge,MAX:ge,MIN:ge,COUNT:ge};var he=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,yr={YEAR:e=>`YEAR(${e})`,MONTH:e=>`MONTH(${e})`,DAY:e=>`DAY(${e})`,SUM:(e,t,r)=>r?`coalesce(${t}(distinct ${e}), 0)`:`coalesce(${t}(${e}), 0)`,AVG:he,MAX:he,MIN:he,COUNT:he};var na=e=>{let t=[];return e.fn&&t.push(e.fn),e.distinct&&t.push("distinct"),t.push(e.column),t.join(" ")},sa=e=>{let t=mr(e),r=e==="postgres"?fr:yr;return o=>o.fn&&dr(o.fn)?r[o.fn](t(o.column),o.fn,o.distinct):t(o.column)};function Tr(e,t){let r=Y(t.dbType).from(e,e),o=!1,a=0,n=sa(t.dbType),i={};return{setColumns(s){s.forEach(c=>{let m=na(c);i[m]=m,r.addSelect(n(c),m)})},setLimit:s=>{r.limit(s),o=!0},setOffset(s){r.offset(s)},addOrderBy(s,c){r.addOrderBy(s,c)},addJoin({table:s,alias:c,on:m}){r.leftJoin(s,c||s,m)},addWhere(s){let[c,m]=ee({...s,operator:s.operator||"=",column:n(s)},++a,t.dbType);r.andWhere(c,m)},addHaving(s){let[c,m]=ee({...s,operator:s.operator||"=",column:n(s)},++a,t.dbType);r.andHaving(c,m)},addGroupBy(s){r.addGroupBy(n(s))},hasAlias(s){return!!i[s]},build(){o||r.limit(50);let[s,c]=r.getQueryAndParameters();return{sql:s,params:c}}}}var gr=(e,t)=>{let r=Y(t.dbType).update(e),o=0;return{addWhere(a){let[n,i]=ee(a,++o,t.dbType);r.andWhere(n,i)},setParams(a){let n={};for(let[i,s]of Object.entries(a))s.mode==="raw"?n[i]=()=>s.value:n[i]=s.value;r.set(n)},build(){let[a,n]=r.getQueryAndParameters();return{sql:a,params:n}}}};var hr=(e,t)=>{let r=Y(t.dbType).insert().into(e);return{setValues(o){let a={};for(let[n,i]of Object.entries(o))i.mode==="raw"?a[n]=()=>i.value:a[n]=i.value;r.values([a])},build(){let[o,a]=r.getQueryAndParameters();return{sql:o,params:a}}}};var Be=Tr,br=gr,wr=hr;var Sr=require("typeorm"),Ir=async(e,t)=>{let r=await ce.find({where:{table:{name:(0,Sr.In)(t),datasource:{id:e}}},relations:{table:!0},order:{table:{name:"ASC"},isPrimary:"DESC",name:"ASC"}}),o=[];for(let s of r)o.push({column:s.name,table:s.table.name||"",full:`${s.table.name}.${s.name}`,type:s.type});let a=o.reduce((s,c)=>(s[c.full]=c.type,s),{});return{getAllColumns(){return o},hasColumn(s){return!!a[s]||s==="*"},getPrimaryKeyColumns(){return r.filter(s=>s.isPrimary).map(s=>({table:s.table.name,column:s.name,full:`${s.table.name}.${s.name}`}))},getAvailableJoins:()=>{let s=[],c=new Set(t);for(let m of r)if(m.meta?.referencedBy?.forEach(l=>{c.has(l.table)||s.push({id:[l.table,l.field,m.name,m.table.name].join("."),fromColumn:l.field,fromTable:l.table,toColumn:m.name,toTable:m.table.name,direction:"in"})}),m.meta?.refs){let l=m.meta.refs;c.has(l.table)||s.push({id:[m.name,m.table.name,l.table,l.field].join("."),fromColumn:m.name,fromTable:m.table.name,toColumn:l.field,toTable:l.table,direction:"out"})}return s},getColumnByName:(s,c)=>{for(let m of r)if(m.name===c&&m.table.name===s)return m}}};async function ia(e,t,r){return N.save(N.create({user:{id:e},team:{id:t},dataSource:{id:r.datasourceId},name:r.name,opts:r.opts}))}var be=async(e,t)=>{let{datasourceId:r,size:o=20,page:a}=t,{table:n,joins:i,groupBy:s,orderBy:c}=t.opts,m=await we(r);if(!m)throw new u(404,"Datasource not found");let l=nr(t.opts.columns,t.opts.groupBy,t.opts.aggregations),y=ar(t.opts),d=await Ir(r,y),A=d.getAllColumns(),v;l&&l.length>0?v=l:v=A.map(E=>({column:E.full})),v.forEach(E=>{if(!d.hasColumn(E.column))throw new u(400,`Invalid column ${E.column}`)});let so=s&&s.length>0||t.opts.aggregations&&t.opts.aggregations.length>0;if(l&&l.length>0&&!so){let E=new Set(v.map(oe=>oe.column)),Ee=d.getPrimaryKeyColumns();for(let oe of Ee)E.has(oe.full)||v.push({column:oe.full,hidden:!0})}let io=ia(e.user.id,e.user.currentTeamId,t),x=Be(n,m);x.setLimit(o+1),x.setOffset(o*a),x.setColumns(v),i&&i.forEach(x.addJoin),c.length>0&&c.forEach(({column:E,direction:Ee})=>{x.hasAlias(E)&&x.addOrderBy(Te[m.dbType].escape(E),Ee)}),s&&s.length>0&&s.forEach(E=>{d.hasColumn(E.value)&&x.addGroupBy({column:E.value,fn:E.fn,distinct:E.distinct})}),Le(t.opts.filters,d.getColumnByName).forEach(E=>{E.fn&&pr(E.fn)?x.addHaving(E):x.addWhere(E)});let{sql:uo,params:co}=x.build(),re=await(await $(k(m,!0),m.dbType,e)).executeQuery({sql:uo,params:co,type:"SELECT",allowBulkUpdate:!1}),Me=re.rows.length>o;Me&&re.rows.pop();let{id:mo}=await io,$e=sr(v,re.columns,d.getColumnByName),{hooks:lo,entities:po}=ir($e);return{...re,queryHistoryId:mo,tables:y,allColumns:A,availableHooks:lo,availableEntities:po,availableJoins:d.getAvailableJoins(),columns:$e,hasMore:Me}},Er=async(e,t)=>{let r=await we(t.dataSourceId);if(!r)throw new u(400,"Invalid datasource");let o=await $(k(r,!0),r.dbType,e),a=Be(t.table,r);a.setLimit(2);for(let[c,m]of Object.entries(t.props))a.addWhere({value:[{value:m}],column:c});let{sql:n,params:i}=a.build(),s=await o.executeQuery({sql:n,params:i,type:"SELECT",allowBulkUpdate:!1});if(s.rows.length>1)throw new u(400,"Found multiple rows for given query");if(s.rows.length<1)throw new u(404,"Entity not found");return{entity:s.rows[0],columns:s.columns,sql:n}},Cr=async(e,t)=>{let r=await we(t.datasourceId);if(!r)throw new u(404,"Data source not found");if(!r.allowUpdate)throw new u(403,"This datasource does not allow update operations");let o=br(t.table,r);o.setParams(t.values),Le(t.filters,()=>{}).forEach(s=>{o.addWhere(s)});let{sql:a,params:n}=o.build();return(await $(k(r,!0),r.dbType,e)).executeQuery({sql:a,params:n,type:"UPDATE",allowBulkUpdate:!1})},Rr=async(e,t)=>{let r=await we(t.datasourceId);if(!r)throw new u(404,"Data source not found");if(!r.allowInsert)throw new u(403,"This datasource does not allow insert operations");let o=wr(t.table,r);o.setValues(t.values);let{sql:a,params:n}=o.build();return(await $(k(r,!0),r.dbType,e)).executeQuery({sql:a,type:"INSERT",params:n,allowBulkUpdate:!1})};async function we(e){return C.findOne({where:{id:e},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowUpdate","allowInsert"]})}var Nr=e=>{},ua=["--",";","DROP","drop"],Ar=([e,t])=>{t.mode!=="default"&&ua.forEach(r=>{if(t.value.includes(r))throw new u(400,"Invalid input value for "+e)})},Pr=e=>{if(!e.table)throw new u(400,"Table is required");Object.entries(e.values).forEach(Ar)},Or=e=>{if(!e.table)throw new u(400,"Table is required");Object.entries(e.values).forEach(Ar)};var Dr=h(e=>{e.route({method:"post",url:"/:dsId/select",handler:async t=>{let r=f(t,Nr);return{data:await be(t,r)}}}),e.route({method:"get",url:"/:dsId/entity/:table",handler:async t=>{let{dsId:r,table:o}=p(t),a=_(t);return{data:await Er(t,{table:o,dataSourceId:r,props:a})}}}),e.route({method:"post",url:"/:dsId/insert",config:{requireRole:I("editor")},handler:async t=>{let r=f(t,Pr);return{data:await Rr(t,r)}}}),e.route({method:"post",url:"/:dsId/update",config:{requireRole:I("editor")},handler:async t=>{let r=f(t,Or);return{data:await Cr(t,r)}}})});var vr=h(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:T.str("SERVER_VERSION")}}))});var xr=h(e=>{e.route({method:"get",url:"/:id/users",handler:async t=>{let{id:r}=p(t),o=await B.findOne({where:{id:r},relations:{users:{user:!0}}});if(!o)throw new u(404,"Team not found");return{data:o.users.map(a=>({role:a.role,id:a.user.id,name:a.user.username}))}}}),e.route({method:"post",url:"/",config:{requireRole:I("editor")},handler:async t=>b.transaction(async()=>{let r=t.user.id,o=f(t),a=w.create();a.id=r;let n=B.create(o);await B.save(n);let i=R.create({user:a,team:n});return await R.save(i),{data:n}})}),e.route({method:"patch",url:"/:id/user-role",config:{requireRole:I("admin")},handler:async t=>{let{id:r}=p(t),{role:o,userId:a}=f(t,({role:i})=>{if(i==="owner")throw new u(400,"Only one owner is allowed")});if((await R.findOneBy({user:{id:a},team:{id:r}}))?.role==="owner")throw new u(400,"Cannot change owner role");await R.update({user:{id:a},team:{id:r}},{role:o})}}),e.route({method:"delete",url:"/:id",config:{requireRole:I("admin")},handler:async t=>b.transaction(async()=>{let{id:r}=p(t),{userId:o}=_(t);if((await R.findOneBy({user:{id:o},team:{id:r}}))?.role==="owner")throw new u(400,"Cannot delete team owner");await w.update(o,{currentTeam:null}),await R.delete({user:{id:o},team:{id:r}}),await w.delete({id:o})})})});var Qe=O(require("bcryptjs")),te=async e=>{let t=await Qe.default.genSalt(10);return Qe.default.hash(e,t)};var _r=h(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=await w.findOne({where:{id:t.user.id},relations:{currentTeam:{team:!0}}});if(!r)throw new u(404,"User not found");return{data:{id:r.id,teamId:r.currentTeam?.team.id,teamName:r.currentTeam?.team.name,teamRole:r.currentTeam?.role,username:r.username}}}}),e.route({method:"patch",url:"/",handler:async t=>{let r=t.user.id,o=f(t);if(o.password&&(o.password=await te(o.password)),!(await w.update(r,o)).affected)throw new u(404,"User not found");let n=await w.findOne({where:{id:r},relations:{currentTeam:{team:!0}}});return{data:{id:n?.id,teamId:n?.currentTeam?.team.id,teamName:n?.currentTeam?.team.name,teamRole:n?.currentTeam?.role,username:n?.username}}}}),e.route({method:"post",url:"/",config:{requireRole:I("admin")},handler:async t=>b.transaction(async()=>{let r=f(t),o=await te(r.password),a=await w.save(w.create({username:r.username,password:o})),n=await R.save(R.create({role:"read_only",team:{id:r.teamId},user:{id:a.id}}));await w.update(a.id,{currentTeam:{id:n.id}})})})});var Ur=h(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=t.user.id,o=await H.findOneBy({user:{id:r}});return o||(o=await H.save(H.create({user:{id:r}}))),{data:o}}}),e.route({method:"patch",url:"/",handler:async t=>{let{settings:r}=f(t);if(!r.id)throw new u(400,"Settings id is required!");if(!(await H.update(r.id,r)).affected)throw new u(404,"You do not own these settings!");return{data:await H.findOneBy({id:r.id})}}})});function j(e,...t){let r=[...t];if(e.searchAll&&r.push(e.searchAll),e.filters)for(let o of e.filters)o.value&&r.push(o.value);return r.map(o=>o.toLowerCase()).join(",")}var kr=h(e=>{e.route({method:"post",url:"/",config:{requireRole:I("editor")},handler:async t=>{let r=f(t),o=await N.findOne({where:{id:r.queryId}});if(!o)throw new u(400,"Query not found");let a=await U.save(U.create({isPersonal:!1,team:{id:t.user.currentTeamId},user:{id:t.user.id},query:{id:r.queryId},searchString:j(o.opts,r.name)}));return await N.update(r.queryId,{name:r.name}),{data:a}}}),e.route({method:"delete",url:"/:id",config:{requireRole:I("editor")},handler:async t=>{let{id:r}=p(t);if(!(await U.delete({id:r})).affected)return{status:404,data:"Query not found"}}}),e.route({method:"patch",url:"/:id",handler:async t=>await b.transaction(async()=>{let{id:r}=p(t),o=f(t,i=>{if(!i.name)throw new u(400,"Name is required")}),a=await U.findOne({where:{id:r},relations:{query:!0}});if(!a)throw new u(400,"Query not found");let n=j(a.query.opts,o.name);return await Promise.all([U.update({id:r},{searchString:n}),N.update({id:a.query.id},{name:o.name})]),{data:!0}})})});var Lr=e=>{if(!e.queryId&&!(e.opts&&e.name))throw new u(400,"Either queryId or name and opts are required")};var Br=require("typeorm");var Fe=async()=>{let e=await S.maximum("orderIndex");return e!=null?e+1:0};function qr(e,t){return S.find({where:{team:{id:e},user:{id:t},archived:!1},select:["id","name","orderIndex"],order:{orderIndex:"ASC"}})}var Qr=h(e=>{e.route({method:"get",url:"/",handler:async t=>{let{currentTeamId:r,id:o}=t.user;return{data:await qr(r,o)}}}),e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=p(t),{currentTeamId:o,id:a}=t.user,n=await S.findOne({where:{id:r,team:{id:o},user:{id:a}}});if(!n)throw new u(404,"Not Found");return{data:n}}}),e.route({method:"post",url:"/",handler:async t=>{let{opts:r,name:o,queryId:a}=f(t,Lr),n,i,s=o;if(r)i=r.dataSourceId,n=r;else{let l=await N.findOne({where:{id:a},relations:{dataSource:!0}});if(!l)throw new u(404,"Query not Found");i=l.dataSource.id,n={table:l.opts.table,filters:l.opts.filters,joins:l.opts.joins,orderBy:l.opts.orderBy,columns:l.opts.columns,groupBy:l.opts.groupBy,searchAll:l.opts.searchAll,aggregations:l.opts.aggregations,dataSourceId:l.dataSource.id,page:0,size:50},o||(s=l.name)}let c=await Fe();return{data:await S.save(S.create({name:s||new Date().toISOString(),opts:n||{},orderIndex:c,dataSource:{id:i},user:{id:t.user.id},team:{id:t.user.currentTeamId}}))}}}),e.route({method:"post",url:"/:id/run",handler:async t=>{let{id:r}=p(t),o=f(t),a=await S.findOne({where:{id:r},relations:{user:!0}});if(!a)throw new u(404,"Not found");if(a.user?.id!==t.user.id)throw new u(404,"Not found");return o&&S.update(r,{opts:o||{},searchString:j(o,a.name),updatedAt:new Date}),{data:{result:await be(t,{datasourceId:o.dataSourceId,size:o.size,name:a.name,page:o.page,opts:{table:o.table,filters:o.filters,joins:o.joins,orderBy:o.orderBy,columns:o.columns,groupBy:o.groupBy,searchAll:o.searchAll,aggregations:o.aggregations}})}}}}),e.route({method:"patch",url:"/:id",handler:async t=>{let{id:r}=p(t),o=f(t),a=await S.findOne({where:{id:r,user:{id:t.user.id}}});if(!a)throw new u(404,"Not Found");let n=a.searchString;return o.name&&(n=j(a.opts,o.name)),await S.update(r,{...o,searchString:n}),{data:{id:r}}}}),e.route({method:"patch",url:"/:id/archive",handler:async t=>{let{id:r}=p(t),o=f(t),{currentTeamId:a,id:n}=t.user,i=await S.findOne({where:{id:r,user:{id:t.user.id}},select:["id","orderIndex"]});if(!i)throw new u(404,"Not Found");if(o.others||o.all){let c=ca(a,n,i.id,o);await S.update(c,{archived:!0})}else await S.update(r,{archived:!0});return{data:await qr(a,n)}}}),e.route({method:"patch",url:"/:id/restore",handler:async t=>{let{id:r}=p(t),o=await S.findOne({where:{id:r,user:{id:t.user.id}},select:["id","archived"]});if(!o)throw new u(404,"Not Found");if(!o.archived)throw new u(400,"This tab is not archived");let a=await Fe();return await S.update(r,{archived:!1,orderIndex:a}),{data:{id:r}}}}),e.route({method:"delete",url:"/:id",handler:async t=>{let{id:r}=p(t),o=t.user.id;return await S.delete({id:r,user:{id:o}}),{data:!0}}})});function ca(e,t,r,o){let a={archived:!1,team:{id:e},user:{id:t}};return o.others&&(a.id=(0,Br.Not)(r)),a}var $r=require("node:crypto");var Fr=require("node:crypto"),Mr={teamName:"Default Team",username:"admin"},ma=async()=>{let e=await B.findOneBy({});return e||B.save(B.create({name:Mr.teamName}))},Se=async e=>{let t=await R.findOne({where:{role:"owner"},relations:{user:!0}});if(t)return t.user;let r=await ma(),o=await te(e?.password||(0,Fr.randomBytes)(32).toString("hex")),a=await w.save(w.create({username:e?.name||Mr.username,password:o})),n=await R.save(R.create({user:a,team:r,role:"owner"}));return await w.update(a.id,{currentTeam:n}),a};var Ie={setupAccessToken:void 0},Wr=()=>(Ie.setupAccessToken=(0,$r.randomBytes)(32).toString("hex"),Ie.setupAccessToken),la=e=>{if(!Ie.setupAccessToken)throw new u(400,"Setup already performed");if(!e||e!==Ie.setupAccessToken)throw new u(400,"Invalid setup access token")},W=async()=>D.skipAuth?!1:await w.count()<1,Hr=async e=>{la(e.setupAccessToken),await Se({name:e.userName,password:e.userPassword})};var Gr=h(e=>{e.route({method:"get",url:"/client.config.js",handler:(t,r)=>{let o={skipAuth:D.skipAuth,modeName:D.name,usesCustomDb:Ke(),serverVersion:T.str("SERVER_VERSION","--")};return r.type("application/javascript").send(`window.__CLIENT_CONFIG__ = ${JSON.stringify(o)};`)}}),e.route({method:"get",url:"/",handler:async(t,r)=>await W()?r.redirect("/setup"):r.sendFile("index.html")}),e.route({method:"get",url:"/setup",handler:async(t,r)=>await W()?r.sendFile("setup.html"):r.redirect("/")})});var Yr=e=>{if(!e.setupAccessToken)throw new u(400,"Invalid setup access token");if(!e.userPassword||e.userPassword.length<8)throw new u(400,"Password should be at least 8 chars long");if(!e.userName)throw new u(400,"User name is required")};var jr=h(e=>{e.route({method:"post",url:"/",config:{isPublic:!0},handler:async t=>{if(!await W())throw new u(400,"Setup has already been completed");let o=f(t,Yr);return await Hr(o),{data:!0}}})});var da=[[Gr,"/"],[St,"/api/auth"],[er,"/api/data-sources"],[tr,"/api/project"],[rr,"/api/queries"],[Dr,"/api/runner"],[vr,"/api/status"],[xr,"/api/teams"],[_r,"/api/users"],[Ur,"/api/user-settings"],[kr,"/api/saved-queries"],[Qr,"/api/workbench-tabs"],[jr,"/api/setup"]],Kr=e=>{for(let[t,r]of da)e.register(t,{prefix:r}),console.log("Registered "+r)};var pa=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),fa=async()=>R.findOne({where:{role:"owner"},relations:{user:!0,team:!0}}),ya=async e=>{let t=await fa();if(!t)throw new u(401,"User is not part of a team");e.user={id:t.user.id,currentTeamId:t.team.id,currentTeamRole:t.role}},Ta=async e=>{let t=e.headers.authorization;if(!t)throw new u(401,"Missing auth token");let[r,o]=t.split(" "),{userId:a}=await gt(o),n=await w.findOne({where:{id:a},select:{id:!0,currentTeam:{role:!0,team:{id:!0}}},relations:{currentTeam:{team:!0}}});if(!n)throw new u(401,"Unauthorized");e.user={id:a,currentTeamId:n.currentTeam.team.id,currentTeamRole:n.currentTeam.role}},Vr=async e=>{pa(e)||(D.skipAuth?await ya(e):await Ta(e))};var zr=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Jr=e=>{e.addHook("onRequest",Vr),e.addHook("onRequest",Jt),e.addHook("onResponse",zr)};var Xr=e=>{e.setNotFoundHandler((t,r)=>{if(t.raw.url?.startsWith("/api/")){r.code(404).send({error:"API route not found"});return}r.sendFile("index.html")}),e.setErrorHandler((t,r,o)=>{console.error(t),t instanceof u?o.status(t.status).send({error:t.message}):o.status(500).send({error:"Internal Server Error"})})};var Zr=O(require("@fastify/cookie")),eo=O(require("@fastify/cors"));var to=O(require("@fastify/static")),ro=require("node:path"),oo=e=>{e.register(Zr.default,{}),e.register(eo.default,{origin:J.allowedOrigins,methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),e.register(to.default,{root:(0,ro.join)(__dirname,"web")})};(async function(){let t=(0,ao.default)({querystringParser:o=>no.default.parse(o)});if(je(),oo(t),Jr(t),Kr(t),Xr(t),await t.after(),await mt(),t.listen({port:J.port,host:J.host},(o,a)=>{o&&(console.error(o),process.exit(1)),console.log(`Server listening at ${a}`)}),await W()){let o=Wr();console.log(`Setup access token:
|
|
61
|
+
)`).setParameter("dataSourceId",t).execute(),await e.delete(K,{dataSource:{id:t}})},ye=async(e,t)=>{let r=await e.find(q,{where:{datasource:{id:t}},select:["id"]});for(let o of r)await e.delete(M,{table:{id:o.id}}),await e.delete(q,o)};function Zo(e){let t=new Map;for(let r of e)r.columns?.forEach(o=>{if(o.ref){let a=`${o.ref.table}.${o.ref.field}`,n=t.get(a)||[];n.push({table:r.tableName,field:o.name}),t.set(a,n)}});return t}var Zt=async e=>{let t=await C.findOne({where:{id:e},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]});if(!t)throw new Error("Data source not found");return t.status="INSPECTING",await C.save(t),b.transaction(async r=>{let a=await(await Pt(k(t,!0),t.dbType)).inspectSchema();await ye(r,t.id);let n=Zo(a);for(let i of a){let s=await r.save(q,{datasource:{id:e},name:i.tableName});if(i.columns){let c=[];for(let m of i.columns)c.push(ce.create({table:{id:s.id},name:m.name,isPrimary:!!m.isPrimary,type:m.type,meta:{refs:m.ref,referencedBy:n.get(`${s.name}.${m.name}`)}}));await r.save(M,c)}}await r.save(F,{id:e,status:"READY",lastInspected:new Date})}).catch(r=>{console.error(r),C.save({id:e,status:"FAILED"})}),!0};var er=h(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=p(t),o=await C.findOne({where:{id:r}});if(!o)throw new u(404,"Data source not found");return{data:o}}}),e.route({method:"get",url:"/",handler:async t=>{let{teamId:r}=_(t);return{data:await C.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",config:{requireRole:I("admin")},handler:async t=>{let{teamId:r,ownerId:o,...a}=f(t,It),n=C.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),i=await $(k(n),n.dbType,t);try{await i.checkConnection()}catch{throw new u(400,"Cannot connect to the database, please check datasource configuration")}let{tag:s,iv:c,encrypted:m}=pe.encrypt(n.dbPassword);return n.dbPassword=m,n.dbPasswordIv=c,n.dbPasswordTag=s,{data:await C.save(n)}}}),e.route({method:"put",url:"/:id",config:{requireRole:I("admin")},handler:async t=>{let{id:r}=p(t),o=f(t),a=await C.findOneBy({id:r});if(!a)throw new u(404,"Data source not found");let n=C.merge(a,o);return await C.save(n),{data:n}}}),e.route({method:"delete",url:"/:id",config:{requireRole:I("admin")},handler:async t=>b.transaction(async r=>{let{id:o}=p(t);await r.delete(z,{dataSource:{id:o}}),await Xt(r,o),await ye(r,o),await r.delete(F,{id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=p(t);return{data:{started:await Zt(o)}}}}),e.route({method:"get",url:"/:id/inspections",handler:async t=>{let{id:r}=p(t);return{data:(await me.find({where:{datasource:{id:r}},relations:{columns:!0},order:{name:"ASC",columns:{isPrimary:"DESC",name:"ASC"}}})).map(n=>({tableName:n.name,id:n.id,updatedAt:n.updatedAt,createdAt:n.createdAt,columns:n.columns.map(i=>({name:i.name,type:i.type,isPrimary:i.isPrimary,ref:i.meta?.refs}))}))}}})});var L=require("typeorm"),tr=h(e=>{e.route({method:"get",url:"/team/:teamId/datasources",handler:async t=>{let{teamId:r}=p(t);return{data:await C.find({where:{team:{id:r}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0,dbType:!0,description:!0,allowInsert:!0,allowUpdate:!0}})}}}),e.route({method:"get",url:"/team/:teamId/queries",handler:async t=>{let r=p(t),o=_(t),a=r.teamId||t.user.currentTeamId,n=Number(o.size)||20,i=Number(o.page)||0,s=o.nameFilter?.length?{name:(0,L.Raw)(y=>`LOWER(${y}) LIKE :search`,{search:`%${o.nameFilter.toLowerCase()}%`})}:void 0,c=await U.find({where:[{isPersonal:!1,team:{id:a},query:s},{isPersonal:!0,team:{id:a},query:s,user:{id:t.user.id}}],relations:{query:{dataSource:!0}},take:n+1,skip:i*n,select:{id:!0,query:{id:!0,name:!0,updatedAt:!0,dataSource:{name:!0,dbType:!0}}},order:{query:{updatedAt:"DESC"}}}),m=c.length>n;return m&&c.pop(),{data:c.map(y=>({name:y.query.name,id:y.query.id,updatedAt:y.query.updatedAt,savedQueryId:y.id,datasourceName:y.query.dataSource.name,datasourceType:y.query.dataSource.dbType})),hasMore:m}}}),e.route({method:"get",url:"/team/:teamId/query",handler:async t=>{let{teamId:r}=p(t),{search:o,size:a,selectedDataSources:n}=_(t),i=o.length>3?parseInt(a)||20:8,s={};n?.length&&(s.id=(0,L.In)(n));let[c,m,l]=await Promise.all([me.find({where:{name:(0,L.Raw)(d=>`LOWER(${d}) LIKE :search`,{search:`%${o.toLowerCase()}%`}),datasource:s},relations:{datasource:!0},select:{id:!0,name:!0,datasource:{name:!0,id:!0}},order:{name:"ASC"},take:i}),S.find({where:{searchString:(0,L.Like)(`%${o.toLowerCase()}%`),team:{id:r},user:{id:t.user.id},dataSource:s},relations:{dataSource:!0},select:{id:!0,name:!0,updatedAt:!0,dataSource:{id:!0,name:!0}},order:{updatedAt:"DESC"},take:i}),U.find({where:{searchString:(0,L.Like)(`%${o.toLowerCase()}%`),team:{id:r},query:{dataSource:s}},relations:{query:{dataSource:!0}},select:{id:!0,updatedAt:!0,query:{id:!0,name:!0,dataSource:{name:!0}}},order:{updatedAt:"DESC"},take:i})]),y=[];return c.forEach(d=>{y.push({name:d.name,id:d.id,dataSourceName:d.datasource?.name||"--",dataSourceId:d.datasource?.id||"--",type:"table"})}),m.forEach(d=>{y.push({name:d.name,id:d.id,dataSourceName:d.dataSource?.name||"--",dataSourceId:d.dataSource?.id||"--",type:"tab"})}),l.forEach(d=>{y.push({name:d.query.name,id:d.query.id,dataSourceName:d.query.dataSource?.name||"--",dataSourceId:d.query.dataSource?.id||"--",type:"query"})}),{data:y}}}),e.route({method:"get",url:"/team/:teamId/tabs-history",handler:async t=>{let{teamId:r}=p(t),o=_(t),a=Number(o.page),n=Number(o.size),i=t.user.id,s={team:{id:r},user:{id:i}};o.nameFilter?.length&&(s.name=(0,L.Like)(`%${o.nameFilter}%`)),o.archived&&(s.archived=o.archived==="true");let c=await S.find({where:s,relations:{dataSource:!0},order:{updatedAt:"DESC"},take:n+1,skip:a*n}),m=!1;return c.length>n&&(c.pop(),m=!0),{data:c.map(l=>({name:l.name,id:l.id,updatedAt:l.updatedAt,archived:l.archived,createdAt:l.createdAt,dataSourceId:l.dataSource?.id,dataSourceName:l.dataSource?.name,dataSourceType:l.dataSource?.dbType})),hasMore:m}}})});var rr=h(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=p(t),o=await N.findOne({where:{id:r},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return o?{data:o}:{status:404,data:"Query not found"}}}),e.route({method:"post",url:"/",config:{requireRole:I("editor")},handler:async t=>{let r=f(t),o=await C.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await N.save(N.create({name:r.name,opts:r.opts,team:{id:o?.team.id},dataSource:{id:r.dataSourceId},user:{id:t.user.id}}))}}}),e.route({method:"patch",url:"/:id",config:{requireRole:I("editor")},handler:async t=>{let{id:r}=p(t),o=f(t);if(!(await N.update(r,o)).affected)throw new u(404,"Query not found");return{data:await N.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",config:{requireRole:I("editor")},handler:async t=>b.transaction(async()=>{let{id:r}=p(t);if(!(await N.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var or=e=>e&&fe(e)?"CONTAINS":"=",Le=(e,t)=>{let r=[];for(let o of e){if(!o.column?.length||!o.value?.length||o.isEnabled===!1)continue;let[a,n]=o.column.split("."),i=t(a,n);if(o.mode==="advanced"){let s=zt.parse(o.value);if(!s)throw new u(400,`Invalid value for '${o.column}': ${o.value}`);r.push({value:s.value,column:o.column,operator:s.operator||or(i?.type),fn:o.fn})}else o.mode==="raw"?r.push({value:o.value?[{value:o.value}]:[],column:o.column,operator:"RAW",fn:o.fn}):r.push({value:o.value?[{value:o.value}]:[],column:o.column,operator:or(i?.type),fn:o.fn})}return r},ar=e=>{let t=[e.table];return e.joins&&e.joins.forEach(({table:r})=>t.push(r)),t},ke=e=>({column:e.value,fn:e.fn,distinct:e.distinct}),nr=(e,t,r)=>{let o=[];return t.length>0||r.length>0?o.push(...t.map(ke),...r.map(ke)):e.length>0&&o.push(...e.map(ke)),o},ea=e=>e.isPrimary&&e.table?.name?{table:e.table.name,field:e.name}:e?.meta?.refs,ta=e=>e?.meta?.referencedBy,sr=(e,t,r)=>t.map((o,a)=>{let n=o.table?r(o.table,o.column):void 0,i=n?ea(n):void 0,s=n?ta(n):void 0;return{...o,full:e[a].fn?e[a].column:o.full,type:n?.type,fn:e[a].fn,hidden:e[a].hidden,isPrimary:n?.isPrimary,ref:i,referencedBy:s}}),ir=e=>{let t=[],r=[];for(let o of e)o.referencedBy?.forEach(a=>{t.push({id:[a.table,a.field,o.table,o.column].join("."),fromColumn:a.field,fromTable:a.table,toColumn:o.column,toTable:o.table,direction:"in"})}),o.ref&&(r.push({id:[o.column,o.table,o.ref.table,o.ref.field].join("."),fromColumn:o.column,fromTable:o.table,toColumn:o.ref.field,toTable:o.ref.table,direction:"out"}),o.ref.table!==o.table&&t.push({id:[o.column,o.table,o.ref.table,o.ref.field].join("."),fromColumn:o.column,fromTable:o.table,toColumn:o.ref.field,toTable:o.ref.table,direction:"out"}));return{hooks:t,entities:r}};var qe=require("typeorm"),ur=new qe.DataSource({type:"mysql"}),cr=new qe.DataSource({type:"postgres"}),Y=e=>{switch(e){case"postgres":return cr.createQueryBuilder();case"mysql":return ur.createQueryBuilder();default:throw new Error("Unsupported database connection")}},Te={postgres:cr.driver,mysql:ur.driver};var ee=(e,t,r)=>{let{column:o,operator:a,value:n}=e,i="_"+t;switch(a){case"RAW":let s=" "+o+" ";return[`(${o} ${n[0].value.replace(/\s_\s/g,s)})`,{}];case"IS NULL":case"IS NOT NULL":return[`${o} ${a}`,{value:void 0}];case"IN":case"NOT IN":return[`${o} ${a} (:...${i})`,{[i]:n?.map(l=>l.value)}];case"LIKE":case"CONTAINS":return[`${o} ${r==="postgres"?"ILIKE":"LIKE"} :${i}`,{[i]:a==="CONTAINS"?`%${n?.[0].value}%`:n?.[0].value}];case"NOT LIKE":case"NOT CONTAINS":return[`${o} ${r==="postgres"?"NOT ILIKE":"NOT LIKE"} :${i}`,{[i]:a==="NOT CONTAINS"?`%${n?.[0].value}%`:n?.[0].value}];default:return[`${o} ${a} :${i}`,{[i]:n?.[0]?.value}]}};var mr=e=>{let t=Te[e];return r=>{if(r.includes(".")){let[o,a]=r.split(".");return t.escape(o)+"."+t.escape(a)}return r==="*"?r:t.escape(r)}};var lr=["SUM","COUNT","AVG","MAX","MIN"],ra=["YEAR","MONTH","DAY",...lr],oa=ra.reduce((e,t)=>(e[t]=!0,e),{}),aa=lr.reduce((e,t)=>(e[t]=!0,e),{}),dr=e=>oa[e],pr=e=>aa[e];var ge=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,fr={YEAR:e=>`EXTRACT(YEAR FROM ${e})`,MONTH:e=>`EXTRACT(MONTH FROM ${e})`,DAY:e=>`EXTRACT(DAY FROM ${e})`,SUM:(e,t,r)=>r?`COALESCE(SUM(distinct ${e}), 0)`:`COALESCE(SUM(${e}), 0)`,AVG:ge,MAX:ge,MIN:ge,COUNT:ge};var he=(e,t,r=!1)=>r?`${t}(distinct ${e})`:`${t}(${e})`,yr={YEAR:e=>`YEAR(${e})`,MONTH:e=>`MONTH(${e})`,DAY:e=>`DAY(${e})`,SUM:(e,t,r)=>r?`coalesce(${t}(distinct ${e}), 0)`:`coalesce(${t}(${e}), 0)`,AVG:he,MAX:he,MIN:he,COUNT:he};var na=e=>{let t=[];return e.fn&&t.push(e.fn),e.distinct&&t.push("distinct"),t.push(e.column),t.join(" ")},sa=e=>{let t=mr(e),r=e==="postgres"?fr:yr;return o=>o.fn&&dr(o.fn)?r[o.fn](t(o.column),o.fn,o.distinct):t(o.column)};function Tr(e,t){let r=Y(t.dbType).from(e,e),o=!1,a=0,n=sa(t.dbType),i={};return{setColumns(s){s.forEach(c=>{let m=na(c);i[m]=m,r.addSelect(n(c),m)})},setLimit:s=>{r.limit(s),o=!0},setOffset(s){r.offset(s)},addOrderBy(s,c){r.addOrderBy(s,c)},addJoin({table:s,alias:c,on:m}){r.leftJoin(s,c||s,m)},addWhere(s){let[c,m]=ee({...s,operator:s.operator||"=",column:n(s)},++a,t.dbType);r.andWhere(c,m)},addHaving(s){let[c,m]=ee({...s,operator:s.operator||"=",column:n(s)},++a,t.dbType);r.andHaving(c,m)},addGroupBy(s){r.addGroupBy(n(s))},hasAlias(s){return!!i[s]},build(){o||r.limit(50);let[s,c]=r.getQueryAndParameters();return{sql:s,params:c}}}}var gr=(e,t)=>{let r=Y(t.dbType).update(e),o=0;return{addWhere(a){let[n,i]=ee(a,++o,t.dbType);r.andWhere(n,i)},setParams(a){let n={};for(let[i,s]of Object.entries(a))s.mode==="raw"?n[i]=()=>s.value:n[i]=s.value;r.set(n)},build(){let[a,n]=r.getQueryAndParameters();return{sql:a,params:n}}}};var hr=(e,t)=>{let r=Y(t.dbType).insert().into(e);return{setValues(o){let a={};for(let[n,i]of Object.entries(o))i.mode==="raw"?a[n]=()=>i.value:a[n]=i.value;r.values([a])},build(){let[o,a]=r.getQueryAndParameters();return{sql:o,params:a}}}};var Be=Tr,br=gr,wr=hr;var Sr=require("typeorm"),Ir=async(e,t)=>{let r=await ce.find({where:{table:{name:(0,Sr.In)(t),datasource:{id:e}}},relations:{table:!0},order:{table:{name:"ASC"},isPrimary:"DESC",name:"ASC"}}),o=[];for(let s of r)o.push({column:s.name,table:s.table.name||"",full:`${s.table.name}.${s.name}`,type:s.type});let a=o.reduce((s,c)=>(s[c.full]=c.type,s),{});return{getAllColumns(){return o},hasColumn(s){return!!a[s]||s==="*"},getPrimaryKeyColumns(){return r.filter(s=>s.isPrimary).map(s=>({table:s.table.name,column:s.name,full:`${s.table.name}.${s.name}`}))},getAvailableJoins:()=>{let s=[],c=new Set(t);for(let m of r)if(m.meta?.referencedBy?.forEach(l=>{c.has(l.table)||s.push({id:[l.table,l.field,m.name,m.table.name].join("."),fromColumn:l.field,fromTable:l.table,toColumn:m.name,toTable:m.table.name,direction:"in"})}),m.meta?.refs){let l=m.meta.refs;c.has(l.table)||s.push({id:[m.name,m.table.name,l.table,l.field].join("."),fromColumn:m.name,fromTable:m.table.name,toColumn:l.field,toTable:l.table,direction:"out"})}return s},getColumnByName:(s,c)=>{for(let m of r)if(m.name===c&&m.table.name===s)return m}}};async function ia(e,t,r){return N.save(N.create({user:{id:e},team:{id:t},dataSource:{id:r.datasourceId},name:r.name,opts:r.opts}))}var be=async(e,t)=>{let{datasourceId:r,size:o=20,page:a}=t,{table:n,joins:i,groupBy:s,orderBy:c}=t.opts,m=await we(r);if(!m)throw new u(404,"Datasource not found");let l=nr(t.opts.columns,t.opts.groupBy,t.opts.aggregations),y=ar(t.opts),d=await Ir(r,y),A=d.getAllColumns(),v;l&&l.length>0?v=l:v=A.map(E=>({column:E.full})),v.forEach(E=>{if(!d.hasColumn(E.column))throw new u(400,`Invalid column ${E.column}`)});let so=s&&s.length>0||t.opts.aggregations&&t.opts.aggregations.length>0;if(l&&l.length>0&&!so){let E=new Set(v.map(oe=>oe.column)),Ee=d.getPrimaryKeyColumns();for(let oe of Ee)E.has(oe.full)||v.push({column:oe.full,hidden:!0})}let io=ia(e.user.id,e.user.currentTeamId,t),x=Be(n,m);x.setLimit(o+1),x.setOffset(o*a),x.setColumns(v),i&&i.forEach(x.addJoin),c.length>0&&c.forEach(({column:E,direction:Ee})=>{x.hasAlias(E)&&x.addOrderBy(Te[m.dbType].escape(E),Ee)}),s&&s.length>0&&s.forEach(E=>{d.hasColumn(E.value)&&x.addGroupBy({column:E.value,fn:E.fn,distinct:E.distinct})}),Le(t.opts.filters,d.getColumnByName).forEach(E=>{E.fn&&pr(E.fn)?x.addHaving(E):x.addWhere(E)});let{sql:uo,params:co}=x.build(),re=await(await $(k(m,!0),m.dbType,e)).executeQuery({sql:uo,params:co,type:"SELECT",allowBulkUpdate:!1}),Me=re.rows.length>o;Me&&re.rows.pop();let{id:mo}=await io,$e=sr(v,re.columns,d.getColumnByName),{hooks:lo,entities:po}=ir($e);return{...re,queryHistoryId:mo,tables:y,allColumns:A,availableHooks:lo,availableEntities:po,availableJoins:d.getAvailableJoins(),columns:$e,hasMore:Me}},Er=async(e,t)=>{let r=await we(t.dataSourceId);if(!r)throw new u(400,"Invalid datasource");let o=await $(k(r,!0),r.dbType,e),a=Be(t.table,r);a.setLimit(2);for(let[c,m]of Object.entries(t.props))a.addWhere({value:[{value:m}],column:c});let{sql:n,params:i}=a.build(),s=await o.executeQuery({sql:n,params:i,type:"SELECT",allowBulkUpdate:!1});if(s.rows.length>1)throw new u(400,"Found multiple rows for given query");if(s.rows.length<1)throw new u(404,"Entity not found");return{entity:s.rows[0],columns:s.columns,sql:n}},Cr=async(e,t)=>{let r=await we(t.datasourceId);if(!r)throw new u(404,"Data source not found");if(!r.allowUpdate)throw new u(403,"This datasource does not allow update operations");let o=br(t.table,r);o.setParams(t.values),Le(t.filters,()=>{}).forEach(s=>{o.addWhere(s)});let{sql:a,params:n}=o.build();return(await $(k(r,!0),r.dbType,e)).executeQuery({sql:a,params:n,type:"UPDATE",allowBulkUpdate:!1})},Rr=async(e,t)=>{let r=await we(t.datasourceId);if(!r)throw new u(404,"Data source not found");if(!r.allowInsert)throw new u(403,"This datasource does not allow insert operations");let o=wr(t.table,r);o.setValues(t.values);let{sql:a,params:n}=o.build();return(await $(k(r,!0),r.dbType,e)).executeQuery({sql:a,type:"INSERT",params:n,allowBulkUpdate:!1})};async function we(e){return C.findOne({where:{id:e},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowUpdate","allowInsert"]})}var Nr=e=>{},ua=["--",";","DROP","drop"],Ar=([e,t])=>{t.mode!=="default"&&ua.forEach(r=>{if(t.value.includes(r))throw new u(400,"Invalid input value for "+e)})},Pr=e=>{if(!e.table)throw new u(400,"Table is required");Object.entries(e.values).forEach(Ar)},Or=e=>{if(!e.table)throw new u(400,"Table is required");Object.entries(e.values).forEach(Ar)};var Dr=h(e=>{e.route({method:"post",url:"/:dsId/select",handler:async t=>{let r=f(t,Nr);return{data:await be(t,r)}}}),e.route({method:"get",url:"/:dsId/entity/:table",handler:async t=>{let{dsId:r,table:o}=p(t),a=_(t);return{data:await Er(t,{table:o,dataSourceId:r,props:a})}}}),e.route({method:"post",url:"/:dsId/insert",config:{requireRole:I("editor")},handler:async t=>{let r=f(t,Pr);return{data:await Rr(t,r)}}}),e.route({method:"post",url:"/:dsId/update",config:{requireRole:I("editor")},handler:async t=>{let r=f(t,Or);return{data:await Cr(t,r)}}})});var vr=h(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:T.str("SERVER_VERSION")}}))});var xr=h(e=>{e.route({method:"get",url:"/:id/users",handler:async t=>{let{id:r}=p(t),o=await B.findOne({where:{id:r},relations:{users:{user:!0}}});if(!o)throw new u(404,"Team not found");return{data:o.users.map(a=>({role:a.role,id:a.user.id,name:a.user.username}))}}}),e.route({method:"post",url:"/",config:{requireRole:I("editor")},handler:async t=>b.transaction(async()=>{let r=t.user.id,o=f(t),a=w.create();a.id=r;let n=B.create(o);await B.save(n);let i=R.create({user:a,team:n});return await R.save(i),{data:n}})}),e.route({method:"patch",url:"/:id/user-role",config:{requireRole:I("admin")},handler:async t=>{let{id:r}=p(t),{role:o,userId:a}=f(t,({role:i})=>{if(i==="owner")throw new u(400,"Only one owner is allowed")});if((await R.findOneBy({user:{id:a},team:{id:r}}))?.role==="owner")throw new u(400,"Cannot change owner role");await R.update({user:{id:a},team:{id:r}},{role:o})}}),e.route({method:"delete",url:"/:id",config:{requireRole:I("admin")},handler:async t=>b.transaction(async()=>{let{id:r}=p(t),{userId:o}=_(t);if((await R.findOneBy({user:{id:o},team:{id:r}}))?.role==="owner")throw new u(400,"Cannot delete team owner");await w.update(o,{currentTeam:null}),await R.delete({user:{id:o},team:{id:r}}),await w.delete({id:o})})})});var Qe=O(require("bcryptjs")),te=async e=>{let t=await Qe.default.genSalt(10);return Qe.default.hash(e,t)};var _r=h(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=await w.findOne({where:{id:t.user.id},relations:{currentTeam:{team:!0}}});if(!r)throw new u(404,"User not found");return{data:{id:r.id,teamId:r.currentTeam?.team.id,teamName:r.currentTeam?.team.name,teamRole:r.currentTeam?.role,username:r.username}}}}),e.route({method:"patch",url:"/",handler:async t=>{let r=t.user.id,o=f(t);if(o.password&&(o.password=await te(o.password)),!(await w.update(r,o)).affected)throw new u(404,"User not found");let n=await w.findOne({where:{id:r},relations:{currentTeam:{team:!0}}});return{data:{id:n?.id,teamId:n?.currentTeam?.team.id,teamName:n?.currentTeam?.team.name,teamRole:n?.currentTeam?.role,username:n?.username}}}}),e.route({method:"post",url:"/",config:{requireRole:I("admin")},handler:async t=>b.transaction(async()=>{let r=f(t),o=await te(r.password),a=await w.save(w.create({username:r.username,password:o})),n=await R.save(R.create({role:"read_only",team:{id:r.teamId},user:{id:a.id}}));await w.update(a.id,{currentTeam:{id:n.id}})})})});var Ur=h(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=t.user.id,o=await H.findOneBy({user:{id:r}});return o||(o=await H.save(H.create({user:{id:r}}))),{data:o}}}),e.route({method:"patch",url:"/",handler:async t=>{let{settings:r}=f(t);if(!r.id)throw new u(400,"Settings id is required!");if(!(await H.update(r.id,r)).affected)throw new u(404,"You do not own these settings!");return{data:await H.findOneBy({id:r.id})}}})});function j(e,...t){let r=[...t];if(e.searchAll&&r.push(e.searchAll),e.filters)for(let o of e.filters)o.value&&r.push(o.value);return r.map(o=>o.toLowerCase()).join(",")}var kr=h(e=>{e.route({method:"post",url:"/",config:{requireRole:I("editor")},handler:async t=>{let r=f(t),o=await N.findOne({where:{id:r.queryId}});if(!o)throw new u(400,"Query not found");let a=await U.save(U.create({isPersonal:!1,team:{id:t.user.currentTeamId},user:{id:t.user.id},query:{id:r.queryId},searchString:j(o.opts,r.name)}));return await N.update(r.queryId,{name:r.name}),{data:a}}}),e.route({method:"delete",url:"/:id",config:{requireRole:I("editor")},handler:async t=>{let{id:r}=p(t);if(!(await U.delete({id:r})).affected)return{status:404,data:"Query not found"}}}),e.route({method:"patch",url:"/:id",handler:async t=>await b.transaction(async()=>{let{id:r}=p(t),o=f(t,i=>{if(!i.name)throw new u(400,"Name is required")}),a=await U.findOne({where:{id:r},relations:{query:!0}});if(!a)throw new u(400,"Query not found");let n=j(a.query.opts,o.name);return await Promise.all([U.update({id:r},{searchString:n}),N.update({id:a.query.id},{name:o.name})]),{data:!0}})})});var Lr=e=>{if(!e.queryId&&!(e.opts&&e.name))throw new u(400,"Either queryId or name and opts are required")};var Br=require("typeorm");var Fe=async()=>{let e=await S.maximum("orderIndex");return e!=null?e+1:0};function qr(e,t){return S.find({where:{team:{id:e},user:{id:t},archived:!1},select:["id","name","orderIndex"],order:{orderIndex:"ASC"}})}var Qr=h(e=>{e.route({method:"get",url:"/",handler:async t=>{let{currentTeamId:r,id:o}=t.user;return{data:await qr(r,o)}}}),e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=p(t),{currentTeamId:o,id:a}=t.user,n=await S.findOne({where:{id:r,team:{id:o},user:{id:a}}});if(!n)throw new u(404,"Not Found");return{data:n}}}),e.route({method:"post",url:"/",handler:async t=>{let{opts:r,name:o,queryId:a}=f(t,Lr),n,i,s=o;if(r)i=r.dataSourceId,n=r;else{let l=await N.findOne({where:{id:a},relations:{dataSource:!0}});if(!l)throw new u(404,"Query not Found");i=l.dataSource.id,n={table:l.opts.table,filters:l.opts.filters,joins:l.opts.joins,orderBy:l.opts.orderBy,columns:l.opts.columns,groupBy:l.opts.groupBy,searchAll:l.opts.searchAll,aggregations:l.opts.aggregations,dataSourceId:l.dataSource.id,page:0,size:50},o||(s=l.name)}let c=await Fe();return{data:await S.save(S.create({name:s||new Date().toISOString(),opts:n||{},orderIndex:c,dataSource:{id:i},user:{id:t.user.id},team:{id:t.user.currentTeamId}}))}}}),e.route({method:"post",url:"/:id/run",handler:async t=>{let{id:r}=p(t),o=f(t),a=await S.findOne({where:{id:r},relations:{user:!0}});if(!a)throw new u(404,"Not found");if(a.user?.id!==t.user.id)throw new u(404,"Not found");return o&&S.update(r,{opts:o||{},searchString:j(o,a.name),updatedAt:new Date}),{data:{result:await be(t,{datasourceId:o.dataSourceId,size:o.size,name:a.name,page:o.page,opts:{table:o.table,filters:o.filters,joins:o.joins,orderBy:o.orderBy,columns:o.columns,groupBy:o.groupBy,searchAll:o.searchAll,aggregations:o.aggregations}})}}}}),e.route({method:"patch",url:"/:id",handler:async t=>{let{id:r}=p(t),o=f(t),a=await S.findOne({where:{id:r,user:{id:t.user.id}}});if(!a)throw new u(404,"Not Found");let n=a.searchString;return o.name&&(n=j(a.opts,o.name)),await S.update(r,{...o,searchString:n}),{data:{id:r}}}}),e.route({method:"patch",url:"/:id/archive",handler:async t=>{let{id:r}=p(t),o=f(t),{currentTeamId:a,id:n}=t.user,i=await S.findOne({where:{id:r,user:{id:t.user.id}},select:["id","orderIndex"]});if(!i)throw new u(404,"Not Found");if(o.others||o.all){let c=ca(a,n,i.id,o);await S.update(c,{archived:!0})}else await S.update(r,{archived:!0});return{data:await qr(a,n)}}}),e.route({method:"patch",url:"/:id/restore",handler:async t=>{let{id:r}=p(t),o=await S.findOne({where:{id:r,user:{id:t.user.id}},select:["id","archived"]});if(!o)throw new u(404,"Not Found");if(!o.archived)throw new u(400,"This tab is not archived");let a=await Fe();return await S.update(r,{archived:!1,orderIndex:a}),{data:{id:r}}}}),e.route({method:"delete",url:"/:id",handler:async t=>{let{id:r}=p(t),o=t.user.id;return await S.delete({id:r,user:{id:o}}),{data:!0}}})});function ca(e,t,r,o){let a={archived:!1,team:{id:e},user:{id:t}};return o.others&&(a.id=(0,Br.Not)(r)),a}var $r=require("node:crypto");var Fr=require("node:crypto"),Mr={teamName:"Default Team",username:"admin"},ma=async()=>{let e=await B.findOneBy({});return e||B.save(B.create({name:Mr.teamName}))},Se=async e=>{let t=await R.findOne({where:{role:"owner"},relations:{user:!0}});if(t)return t.user;let r=await ma(),o=await te(e?.password||(0,Fr.randomBytes)(32).toString("hex")),a=await w.save(w.create({username:e?.name||Mr.username,password:o})),n=await R.save(R.create({user:a,team:r,role:"owner"}));return await w.update(a.id,{currentTeam:n}),a};var Ie={setupAccessToken:void 0},Wr=()=>(Ie.setupAccessToken=(0,$r.randomBytes)(32).toString("hex"),Ie.setupAccessToken),la=e=>{if(!Ie.setupAccessToken)throw new u(400,"Setup already performed");if(!e||e!==Ie.setupAccessToken)throw new u(400,"Invalid setup access token")},W=async()=>D.skipAuth?!1:await w.count()<1,Hr=async e=>{la(e.setupAccessToken),await Se({name:e.userName,password:e.userPassword})};var Gr=h(e=>{e.route({method:"get",url:"/client.config.js",handler:(t,r)=>{let o={skipAuth:D.skipAuth,modeName:D.name,usesCustomDb:Ke(),serverVersion:T.str("SERVER_VERSION","--")};return r.type("application/javascript").send(`window.__CLIENT_CONFIG__ = ${JSON.stringify(o)};`)}}),e.route({method:"get",url:"/",handler:async(t,r)=>await W()?r.redirect("/setup"):r.sendFile("index.html")}),e.route({method:"get",url:"/setup",handler:async(t,r)=>await W()?r.sendFile("setup.html"):r.redirect("/")})});var Yr=e=>{if(!e.setupAccessToken)throw new u(400,"Invalid setup access token");if(!e.userPassword||e.userPassword.length<8)throw new u(400,"Password should be at least 8 chars long");if(!e.userName)throw new u(400,"User name is required")};var jr=h(e=>{e.route({method:"post",url:"/",config:{isPublic:!0},handler:async t=>{if(!await W())throw new u(400,"Setup has already been completed");let o=f(t,Yr);return await Hr(o),{data:!0}}})});var da=[[Gr,"/"],[St,"/api/auth"],[er,"/api/data-sources"],[tr,"/api/project"],[rr,"/api/queries"],[Dr,"/api/runner"],[vr,"/api/status"],[xr,"/api/teams"],[_r,"/api/users"],[Ur,"/api/user-settings"],[kr,"/api/saved-queries"],[Qr,"/api/workbench-tabs"],[jr,"/api/setup"]],Kr=e=>{for(let[t,r]of da)e.register(t,{prefix:r}),console.log("Registered "+r)};var pa=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),fa=async()=>R.findOne({where:{role:"owner"},relations:{user:!0,team:!0}}),ya=async e=>{let t=await fa();if(!t)throw new u(401,"User is not part of a team");e.user={id:t.user.id,currentTeamId:t.team.id,currentTeamRole:t.role}},Ta=async e=>{let t=e.headers.authorization;if(!t)throw new u(401,"Missing auth token");let[r,o]=t.split(" "),{userId:a}=await gt(o),n=await w.findOne({where:{id:a},select:{id:!0,currentTeam:{role:!0,team:{id:!0}}},relations:{currentTeam:{team:!0}}});if(!n)throw new u(401,"Unauthorized");e.user={id:a,currentTeamId:n.currentTeam.team.id,currentTeamRole:n.currentTeam.role}},Vr=async e=>{pa(e)||(D.skipAuth?await ya(e):await Ta(e))};var zr=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Jr=e=>{e.addHook("onRequest",Vr),e.addHook("onRequest",Jt),e.addHook("onResponse",zr)};var Xr=e=>{e.setNotFoundHandler((t,r)=>{if(t.raw.url?.startsWith("/api/")){r.code(404).send({error:"API route not found"});return}r.sendFile("index.html")}),e.setErrorHandler((t,r,o)=>{console.error(t),t instanceof u?o.status(t.status).send({error:t.message}):o.status(500).send({error:"Internal Server Error"})})};var Zr=O(require("@fastify/cookie")),eo=O(require("@fastify/cors"));var to=O(require("@fastify/static")),ro=require("node:path"),oo=e=>{e.register(Zr.default,{}),e.register(eo.default,{origin:J.allowedOrigins,methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),e.register(to.default,{root:(0,ro.join)(__dirname,"web")})};(async function(){let t=(0,ao.default)({querystringParser:o=>no.default.parse(o)});if(je(),oo(t),Jr(t),Kr(t),Xr(t),await t.after(),await mt(),t.listen({port:J.port,host:J.host},(o,a)=>{o&&(console.error(o),process.exit(1)),console.log(`Server listening at ${a}`)}),await W()){let o=Wr();console.log(`Setup access token:
|
|
62
62
|
${o}`),console.log("Use the above token to finish the setup process when opening the app for the first time.")}else await Se()})();
|