@dataramen/cli 0.0.34 → 0.0.36

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/bin/run.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- var U=Object.create;var b=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var Q=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty;var Z=(e,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of z(t))!X.call(e,n)&&n!==r&&b(e,n,{get:()=>t[n],enumerable:!(i=q(t,n))||i.enumerable});return e};var m=(e,t,r)=>(r=e!=null?U(Q(e)):{},Z(t||!e||!e.__esModule?b(r,"default",{value:e,enumerable:!0}):r,e));var B=m(require("yargs")),G=require("yargs/helpers");var T=require("node:os"),C=require("node:path"),ee=(0,T.homedir)();var c="@dataramen/local-server",s=(0,C.join)(ee,".dataramen",".runtime","server");var L=require("node:path"),Y=m(require("fs-extra")),D=require("node:child_process");var V=m(require("fs-extra")),w=require("node:path");function A(e){let t;function r(){try{return t||(t=V.readJsonSync(e)),t}catch{return}}return r}var k=A((0,w.join)(__dirname,"..","package.json")),v=A((0,w.join)(s,"package.json"));var f=m(require("fs-extra")),l=require("node:path"),N=require("node:child_process"),M=require("node:util"),E=m(require("yocto-spinner")),d=(0,M.promisify)(N.exec);function O(){try{let e=v();if(!e)return!0;let t=f.readJsonSync((0,l.join)(__dirname,"..","dist","package.json"));return e.version!==t.version}catch{return!0}}async function W(){let e=(0,E.default)({text:"Checking if PM2 is installed"}).start();try{return await d("pm2 -v"),e.success("PM2 already installed"),!0}catch{return e.warning("PM2 not installed"),!1}}async function j(){let e=(0,E.default)({text:"Installing PM2"}).start();try{await d("npm i -g pm2"),e.success("Installed PM2")}catch{e.error("Failed to install PM2"),process.exit(1)}}async function P(){let e=(0,E.default)({text:"Stop running instances of "+c}).start();try{await d(`pm2 stop "${c}"`),e.warning("Stopped "+c)}catch{e.success("No running instances of "+c+" found")}}async function I(){let e=(0,E.default)({text:"Create local server"}).start();f.removeSync((0,l.join)(s,"code")),f.copySync((0,l.join)(__dirname,"..","dist","code"),(0,l.join)(s,"code")),f.copySync((0,l.join)(__dirname,"..","dist","env",".env.default"),(0,l.join)(s,"env",".env.default")),f.copySync((0,l.join)(__dirname,"..","dist","package.json"),(0,l.join)(s,"package.json")),e.text="Install local server dependencies",await d("npm i",{cwd:s}),e.success("Local server installed")}var _=m(require("yocto-spinner")),x=m(require("open"));var J=require("node:net");async function H(e){return new Promise(t=>{let r=(0,J.createServer)().once("error",()=>{t(!1)}).once("listening",()=>{r.close()}).once("close",()=>t(!0)).listen(e,"127.0.0.1")})}var y=m(require("node:crypto"));var S=require("fs-extra"),R=require("node:path");function te(e){try{return(0,S.readFileSync)((0,R.join)(s,"env",e),"utf-8")}catch{return}}function $(e){let t={},r=te(e);if(r){let i=r.split(`
2
+ var U=Object.create;var b=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var Q=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty;var Z=(e,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of z(t))!X.call(e,n)&&n!==r&&b(e,n,{get:()=>t[n],enumerable:!(i=q(t,n))||i.enumerable});return e};var m=(e,t,r)=>(r=e!=null?U(Q(e)):{},Z(t||!e||!e.__esModule?b(r,"default",{value:e,enumerable:!0}):r,e));var B=m(require("yargs")),G=require("yargs/helpers");var T=require("node:os"),C=require("node:path"),ee=(0,T.homedir)(),c="@dataramen/server",s=(0,C.join)(ee,".dataramen",".runtime","server");var Y=require("node:path"),D=m(require("fs-extra")),L=require("node:child_process");var V=m(require("fs-extra")),w=require("node:path");function k(e){let t;function r(){try{return t||(t=V.readJsonSync(e)),t}catch{return}}return r}var A=k((0,w.join)(__dirname,"..","package.json")),v=k((0,w.join)(s,"package.json"));var f=m(require("fs-extra")),l=require("node:path"),N=require("node:child_process"),M=require("node:util"),E=m(require("yocto-spinner")),d=(0,M.promisify)(N.exec);function W(){try{let e=v();if(!e)return!0;let t=f.readJsonSync((0,l.join)(__dirname,"..","dist","package.json"));return e.version!==t.version}catch{return!0}}async function j(){let e=(0,E.default)({text:"Checking if PM2 is installed"}).start();try{return await d("pm2 -v"),e.success("PM2 already installed"),!0}catch{return e.warning("PM2 not installed"),!1}}async function I(){let e=(0,E.default)({text:"Installing PM2"}).start();try{await d("npm i -g pm2"),e.success("Installed PM2")}catch{e.error("Failed to install PM2"),process.exit(1)}}async function R(){let e=(0,E.default)({text:"Stop running instances of "+c}).start();try{await d(`pm2 stop "${c}"`),e.warning("Stopped "+c)}catch{e.success("No running instances of "+c+" found")}}async function J(){let e=(0,E.default)({text:"Create local server"}).start();f.removeSync((0,l.join)(s,"code")),f.copySync((0,l.join)(__dirname,"..","dist","code"),(0,l.join)(s,"code")),f.copySync((0,l.join)(__dirname,"..","dist","env",".env.default"),(0,l.join)(s,"env",".env.default")),f.copySync((0,l.join)(__dirname,"..","dist","package.json"),(0,l.join)(s,"package.json")),e.text="Install local server dependencies",await d("npm i",{cwd:s}),e.success("Local server installed")}var _=m(require("yocto-spinner")),x=m(require("open"));var H=require("node:net");async function O(e){return new Promise(t=>{let r=(0,H.createServer)().once("error",()=>{t(!1)}).once("listening",()=>{r.close()}).once("close",()=>t(!0)).listen(e,"127.0.0.1")})}var y=m(require("node:crypto"));var S=require("fs-extra"),P=require("node:path");function te(e){try{return(0,S.readFileSync)((0,P.join)(s,"env",e),"utf-8")}catch{return}}function $(e){let t={},r=te(e);if(r){let i=r.split(`
3
3
  `);for(let n of i){let o=n.trim();if(!o||o.startsWith("#"))continue;let p=o.indexOf("=");if(p===-1)continue;let h=o.slice(0,p).trim(),u=o.slice(p+1).trim();(u.startsWith('"')&&u.endsWith('"')||u.startsWith("'")&&u.endsWith("'"))&&(u=u.slice(1,-1)),t[h]=u}}return t}function ne(){let e={defaultValues:{},customValues:{}};function t(){e.defaultValues=$(".env.default"),e.customValues=$(".env")}function r(){let o=Object.entries(e.customValues).map(([p,h])=>`${p}=${h}`).join(`
4
4
  `)+`
5
- `;(0,S.writeFileSync)((0,R.join)(s,"env",".env"),o,{encoding:"utf8"})}function i(n){return e.customValues[n]?e.customValues[n]:e.defaultValues[n]}return t(),{getNumber:n=>re(i(n)),getString:n=>oe(i(n)),getBoolean:n=>se(i(n)),flush:r,set:(n,o)=>{e.customValues[n]=o}}}function re(e){if(!e)return;let t=Number(e);if(!isNaN(t)&&e.trim()!=="")return t;throw new Error("Wrong env value type")}function oe(e){if(e){if(typeof e=="string")return e;throw new Error("Wrong env value type")}}function se(e){if(!e)return;let t=e.toLowerCase();if(t==="true")return!0;if(t==="false")return!1;throw new Error("Wrong env value type")}var a=ne();function F(){let e=!1;if(!a.getString("SYMM_ENCRYPTION_KEY")){let t=y.randomBytes(32).toString("hex");a.set("SYMM_ENCRYPTION_KEY",t),console.log("Generated random SYMM_ENCRYPTION_KEY"),e=!0}if(!a.getString("JWT_SECRET")){let t=y.randomBytes(32).toString("hex");a.set("JWT_SECRET",t),console.log("Generated random JWT_SECRET"),e=!0}if(!a.getString("JWT_REFRESH_SECRET")){let t=y.randomBytes(32).toString("hex");a.set("JWT_REFRESH_SECRET",t),console.log("Generated random JWT_REFRESH_SECRET"),e=!0}e&&a.flush()}var ie=async e=>{try{return(await fetch(e,{method:"GET",signal:AbortSignal.timeout(5e3)})).status===200}catch{return!1}},K=async(e,t,r)=>{let i=Date.now();for(;Date.now()-i<t;){if(await ie(e))return!0;await new Promise(o=>setTimeout(o,r))}return!1};async function le(){await W()||await j(),await P();try{O()&&await I(),F();let t=a.getNumber("PORT");if(!t)throw new Error("PORT env variable not found");if(!await H(t))throw new Error(`Port ${t} is occupied by another process`);let i=(0,_.default)({text:"Starting new instance of "+c}).start(),n=Y.readJsonSync((0,L.join)(s,"package.json"));await d(`pm2 start "${n.main}" --name "${c}" --no-autorestart`,{cwd:s}),i.success("Local server will be available in a couple of seconds");let o=(0,_.default)({text:"Waiting for the server to become available"}).start();await K(`http://localhost:${t}/api/status`,3e4,1e3)?(await(0,x.default)(`http://localhost:${t}`),o.success(`App is running at http://localhost:${t}`)):o.error("Server failed to become available in time")}catch(t){console.error("Failed to start local server",t)}}async function me(){(0,D.execSync)(`pm2 logs ${c}`,{stdio:"inherit"})}async function fe(){await P()}function ue(){console.log(`DataRamen CLI version: ${k().version}`),console.log(`DataRamen local server version: ${v().version}`)}async function pe(){let e=a.getNumber("PORT");await(0,x.default)(`http://localhost:${e}`)}var g={start:le,logs:me,stop:fe,version:ue,open:pe};(0,B.default)((0,G.hideBin)(process.argv)).command("start","Default command, start/restart the server",g.start).command(["logs"],"Listen for logs",g.logs).command("stop","Stop the server",g.stop).command("open","Stop the server",g.open).command(["version"],"Show version",g.version).parse();
5
+ `;(0,S.writeFileSync)((0,P.join)(s,"env",".env"),o,{encoding:"utf8"})}function i(n){return e.customValues[n]?e.customValues[n]:e.defaultValues[n]}return t(),{getNumber:n=>re(i(n)),getString:n=>oe(i(n)),getBoolean:n=>se(i(n)),flush:r,set:(n,o)=>{e.customValues[n]=o}}}function re(e){if(!e)return;let t=Number(e);if(!isNaN(t)&&e.trim()!=="")return t;throw new Error("Wrong env value type")}function oe(e){if(e){if(typeof e=="string")return e;throw new Error("Wrong env value type")}}function se(e){if(!e)return;let t=e.toLowerCase();if(t==="true")return!0;if(t==="false")return!1;throw new Error("Wrong env value type")}var a=ne();function F(){let e=!1;if(!a.getString("SYMM_ENCRYPTION_KEY")){let t=y.randomBytes(32).toString("hex");a.set("SYMM_ENCRYPTION_KEY",t),console.log("Generated random SYMM_ENCRYPTION_KEY"),e=!0}if(!a.getString("JWT_SECRET")){let t=y.randomBytes(32).toString("hex");a.set("JWT_SECRET",t),console.log("Generated random JWT_SECRET"),e=!0}if(!a.getString("JWT_REFRESH_SECRET")){let t=y.randomBytes(32).toString("hex");a.set("JWT_REFRESH_SECRET",t),console.log("Generated random JWT_REFRESH_SECRET"),e=!0}e&&a.flush()}var ie=async e=>{try{return(await fetch(e,{method:"GET",signal:AbortSignal.timeout(5e3)})).status===200}catch{return!1}},K=async(e,t,r)=>{let i=Date.now();for(;Date.now()-i<t;){if(await ie(e))return!0;await new Promise(o=>setTimeout(o,r))}return!1};async function le(){await j()||await I(),await R();try{W()&&await J(),F();let t=a.getNumber("PORT");if(!t)throw new Error("PORT env variable not found");if(!await O(t))throw new Error(`Port ${t} is occupied by another process`);let i=(0,_.default)({text:"Starting new instance of "+c}).start(),n=D.readJsonSync((0,Y.join)(s,"package.json"));await d(`pm2 start "${n.main}" --name "${c}" --no-autorestart`,{cwd:s}),i.success("Local server will be available in a couple of seconds");let o=(0,_.default)({text:"Waiting for the server to become available"}).start();await K(`http://localhost:${t}/api/status`,3e4,1e3)?(await(0,x.default)(`http://localhost:${t}`),o.success(`App is running at http://localhost:${t}`)):o.error("Server failed to become available in time")}catch(t){console.error("Failed to start local server",t)}}async function me(){(0,L.execSync)(`pm2 logs ${c}`,{stdio:"inherit"})}async function fe(){await R()}function ue(){console.log(`DataRamen CLI version: ${A().version}`),console.log(`DataRamen local server version: ${v().version}`)}async function pe(){let e=a.getNumber("PORT");await(0,x.default)(`http://localhost:${e}`)}var g={start:le,logs:me,stop:fe,version:ue,open:pe};(0,B.default)((0,G.hideBin)(process.argv)).command("start","Default command, start/restart the server",g.start).command(["logs"],"Listen for logs",g.logs).command("stop","Stop the server",g.stop).command("open","Stop the server",g.open).command(["version"],"Show version",g.version).parse();
package/dist/code/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- var U=Object.create;var b=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var Q=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty;var Z=(e,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of z(t))!X.call(e,n)&&n!==r&&b(e,n,{get:()=>t[n],enumerable:!(i=q(t,n))||i.enumerable});return e};var m=(e,t,r)=>(r=e!=null?U(Q(e)):{},Z(t||!e||!e.__esModule?b(r,"default",{value:e,enumerable:!0}):r,e));var B=m(require("yargs")),G=require("yargs/helpers");var T=require("node:os"),C=require("node:path"),ee=(0,T.homedir)();var c="@dataramen/local-server",s=(0,C.join)(ee,".dataramen",".runtime","server");var L=require("node:path"),Y=m(require("fs-extra")),D=require("node:child_process");var V=m(require("fs-extra")),w=require("node:path");function A(e){let t;function r(){try{return t||(t=V.readJsonSync(e)),t}catch{return}}return r}var k=A((0,w.join)(__dirname,"..","package.json")),v=A((0,w.join)(s,"package.json"));var f=m(require("fs-extra")),l=require("node:path"),N=require("node:child_process"),M=require("node:util"),E=m(require("yocto-spinner")),d=(0,M.promisify)(N.exec);function O(){try{let e=v();if(!e)return!0;let t=f.readJsonSync((0,l.join)(__dirname,"..","dist","package.json"));return e.version!==t.version}catch{return!0}}async function W(){let e=(0,E.default)({text:"Checking if PM2 is installed"}).start();try{return await d("pm2 -v"),e.success("PM2 already installed"),!0}catch{return e.warning("PM2 not installed"),!1}}async function j(){let e=(0,E.default)({text:"Installing PM2"}).start();try{await d("npm i -g pm2"),e.success("Installed PM2")}catch{e.error("Failed to install PM2"),process.exit(1)}}async function P(){let e=(0,E.default)({text:"Stop running instances of "+c}).start();try{await d(`pm2 stop "${c}"`),e.warning("Stopped "+c)}catch{e.success("No running instances of "+c+" found")}}async function I(){let e=(0,E.default)({text:"Create local server"}).start();f.removeSync((0,l.join)(s,"code")),f.copySync((0,l.join)(__dirname,"..","dist","code"),(0,l.join)(s,"code")),f.copySync((0,l.join)(__dirname,"..","dist","env",".env.default"),(0,l.join)(s,"env",".env.default")),f.copySync((0,l.join)(__dirname,"..","dist","package.json"),(0,l.join)(s,"package.json")),e.text="Install local server dependencies",await d("npm i",{cwd:s}),e.success("Local server installed")}var _=m(require("yocto-spinner")),x=m(require("open"));var J=require("node:net");async function H(e){return new Promise(t=>{let r=(0,J.createServer)().once("error",()=>{t(!1)}).once("listening",()=>{r.close()}).once("close",()=>t(!0)).listen(e,"127.0.0.1")})}var y=m(require("node:crypto"));var S=require("fs-extra"),R=require("node:path");function te(e){try{return(0,S.readFileSync)((0,R.join)(s,"env",e),"utf-8")}catch{return}}function $(e){let t={},r=te(e);if(r){let i=r.split(`
2
+ var U=Object.create;var b=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var Q=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty;var Z=(e,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of z(t))!X.call(e,n)&&n!==r&&b(e,n,{get:()=>t[n],enumerable:!(i=q(t,n))||i.enumerable});return e};var m=(e,t,r)=>(r=e!=null?U(Q(e)):{},Z(t||!e||!e.__esModule?b(r,"default",{value:e,enumerable:!0}):r,e));var B=m(require("yargs")),G=require("yargs/helpers");var T=require("node:os"),C=require("node:path"),ee=(0,T.homedir)(),c="@dataramen/server",s=(0,C.join)(ee,".dataramen",".runtime","server");var Y=require("node:path"),D=m(require("fs-extra")),L=require("node:child_process");var V=m(require("fs-extra")),w=require("node:path");function k(e){let t;function r(){try{return t||(t=V.readJsonSync(e)),t}catch{return}}return r}var A=k((0,w.join)(__dirname,"..","package.json")),v=k((0,w.join)(s,"package.json"));var f=m(require("fs-extra")),l=require("node:path"),N=require("node:child_process"),M=require("node:util"),E=m(require("yocto-spinner")),d=(0,M.promisify)(N.exec);function W(){try{let e=v();if(!e)return!0;let t=f.readJsonSync((0,l.join)(__dirname,"..","dist","package.json"));return e.version!==t.version}catch{return!0}}async function j(){let e=(0,E.default)({text:"Checking if PM2 is installed"}).start();try{return await d("pm2 -v"),e.success("PM2 already installed"),!0}catch{return e.warning("PM2 not installed"),!1}}async function I(){let e=(0,E.default)({text:"Installing PM2"}).start();try{await d("npm i -g pm2"),e.success("Installed PM2")}catch{e.error("Failed to install PM2"),process.exit(1)}}async function R(){let e=(0,E.default)({text:"Stop running instances of "+c}).start();try{await d(`pm2 stop "${c}"`),e.warning("Stopped "+c)}catch{e.success("No running instances of "+c+" found")}}async function J(){let e=(0,E.default)({text:"Create local server"}).start();f.removeSync((0,l.join)(s,"code")),f.copySync((0,l.join)(__dirname,"..","dist","code"),(0,l.join)(s,"code")),f.copySync((0,l.join)(__dirname,"..","dist","env",".env.default"),(0,l.join)(s,"env",".env.default")),f.copySync((0,l.join)(__dirname,"..","dist","package.json"),(0,l.join)(s,"package.json")),e.text="Install local server dependencies",await d("npm i",{cwd:s}),e.success("Local server installed")}var _=m(require("yocto-spinner")),x=m(require("open"));var H=require("node:net");async function O(e){return new Promise(t=>{let r=(0,H.createServer)().once("error",()=>{t(!1)}).once("listening",()=>{r.close()}).once("close",()=>t(!0)).listen(e,"127.0.0.1")})}var y=m(require("node:crypto"));var S=require("fs-extra"),P=require("node:path");function te(e){try{return(0,S.readFileSync)((0,P.join)(s,"env",e),"utf-8")}catch{return}}function $(e){let t={},r=te(e);if(r){let i=r.split(`
3
3
  `);for(let n of i){let o=n.trim();if(!o||o.startsWith("#"))continue;let p=o.indexOf("=");if(p===-1)continue;let h=o.slice(0,p).trim(),u=o.slice(p+1).trim();(u.startsWith('"')&&u.endsWith('"')||u.startsWith("'")&&u.endsWith("'"))&&(u=u.slice(1,-1)),t[h]=u}}return t}function ne(){let e={defaultValues:{},customValues:{}};function t(){e.defaultValues=$(".env.default"),e.customValues=$(".env")}function r(){let o=Object.entries(e.customValues).map(([p,h])=>`${p}=${h}`).join(`
4
4
  `)+`
5
- `;(0,S.writeFileSync)((0,R.join)(s,"env",".env"),o,{encoding:"utf8"})}function i(n){return e.customValues[n]?e.customValues[n]:e.defaultValues[n]}return t(),{getNumber:n=>re(i(n)),getString:n=>oe(i(n)),getBoolean:n=>se(i(n)),flush:r,set:(n,o)=>{e.customValues[n]=o}}}function re(e){if(!e)return;let t=Number(e);if(!isNaN(t)&&e.trim()!=="")return t;throw new Error("Wrong env value type")}function oe(e){if(e){if(typeof e=="string")return e;throw new Error("Wrong env value type")}}function se(e){if(!e)return;let t=e.toLowerCase();if(t==="true")return!0;if(t==="false")return!1;throw new Error("Wrong env value type")}var a=ne();function F(){let e=!1;if(!a.getString("SYMM_ENCRYPTION_KEY")){let t=y.randomBytes(32).toString("hex");a.set("SYMM_ENCRYPTION_KEY",t),console.log("Generated random SYMM_ENCRYPTION_KEY"),e=!0}if(!a.getString("JWT_SECRET")){let t=y.randomBytes(32).toString("hex");a.set("JWT_SECRET",t),console.log("Generated random JWT_SECRET"),e=!0}if(!a.getString("JWT_REFRESH_SECRET")){let t=y.randomBytes(32).toString("hex");a.set("JWT_REFRESH_SECRET",t),console.log("Generated random JWT_REFRESH_SECRET"),e=!0}e&&a.flush()}var ie=async e=>{try{return(await fetch(e,{method:"GET",signal:AbortSignal.timeout(5e3)})).status===200}catch{return!1}},K=async(e,t,r)=>{let i=Date.now();for(;Date.now()-i<t;){if(await ie(e))return!0;await new Promise(o=>setTimeout(o,r))}return!1};async function le(){await W()||await j(),await P();try{O()&&await I(),F();let t=a.getNumber("PORT");if(!t)throw new Error("PORT env variable not found");if(!await H(t))throw new Error(`Port ${t} is occupied by another process`);let i=(0,_.default)({text:"Starting new instance of "+c}).start(),n=Y.readJsonSync((0,L.join)(s,"package.json"));await d(`pm2 start "${n.main}" --name "${c}" --no-autorestart`,{cwd:s}),i.success("Local server will be available in a couple of seconds");let o=(0,_.default)({text:"Waiting for the server to become available"}).start();await K(`http://localhost:${t}/api/status`,3e4,1e3)?(await(0,x.default)(`http://localhost:${t}`),o.success(`App is running at http://localhost:${t}`)):o.error("Server failed to become available in time")}catch(t){console.error("Failed to start local server",t)}}async function me(){(0,D.execSync)(`pm2 logs ${c}`,{stdio:"inherit"})}async function fe(){await P()}function ue(){console.log(`DataRamen CLI version: ${k().version}`),console.log(`DataRamen local server version: ${v().version}`)}async function pe(){let e=a.getNumber("PORT");await(0,x.default)(`http://localhost:${e}`)}var g={start:le,logs:me,stop:fe,version:ue,open:pe};(0,B.default)((0,G.hideBin)(process.argv)).command("start","Default command, start/restart the server",g.start).command(["logs"],"Listen for logs",g.logs).command("stop","Stop the server",g.stop).command("open","Stop the server",g.open).command(["version"],"Show version",g.version).parse();
5
+ `;(0,S.writeFileSync)((0,P.join)(s,"env",".env"),o,{encoding:"utf8"})}function i(n){return e.customValues[n]?e.customValues[n]:e.defaultValues[n]}return t(),{getNumber:n=>re(i(n)),getString:n=>oe(i(n)),getBoolean:n=>se(i(n)),flush:r,set:(n,o)=>{e.customValues[n]=o}}}function re(e){if(!e)return;let t=Number(e);if(!isNaN(t)&&e.trim()!=="")return t;throw new Error("Wrong env value type")}function oe(e){if(e){if(typeof e=="string")return e;throw new Error("Wrong env value type")}}function se(e){if(!e)return;let t=e.toLowerCase();if(t==="true")return!0;if(t==="false")return!1;throw new Error("Wrong env value type")}var a=ne();function F(){let e=!1;if(!a.getString("SYMM_ENCRYPTION_KEY")){let t=y.randomBytes(32).toString("hex");a.set("SYMM_ENCRYPTION_KEY",t),console.log("Generated random SYMM_ENCRYPTION_KEY"),e=!0}if(!a.getString("JWT_SECRET")){let t=y.randomBytes(32).toString("hex");a.set("JWT_SECRET",t),console.log("Generated random JWT_SECRET"),e=!0}if(!a.getString("JWT_REFRESH_SECRET")){let t=y.randomBytes(32).toString("hex");a.set("JWT_REFRESH_SECRET",t),console.log("Generated random JWT_REFRESH_SECRET"),e=!0}e&&a.flush()}var ie=async e=>{try{return(await fetch(e,{method:"GET",signal:AbortSignal.timeout(5e3)})).status===200}catch{return!1}},K=async(e,t,r)=>{let i=Date.now();for(;Date.now()-i<t;){if(await ie(e))return!0;await new Promise(o=>setTimeout(o,r))}return!1};async function le(){await j()||await I(),await R();try{W()&&await J(),F();let t=a.getNumber("PORT");if(!t)throw new Error("PORT env variable not found");if(!await O(t))throw new Error(`Port ${t} is occupied by another process`);let i=(0,_.default)({text:"Starting new instance of "+c}).start(),n=D.readJsonSync((0,Y.join)(s,"package.json"));await d(`pm2 start "${n.main}" --name "${c}" --no-autorestart`,{cwd:s}),i.success("Local server will be available in a couple of seconds");let o=(0,_.default)({text:"Waiting for the server to become available"}).start();await K(`http://localhost:${t}/api/status`,3e4,1e3)?(await(0,x.default)(`http://localhost:${t}`),o.success(`App is running at http://localhost:${t}`)):o.error("Server failed to become available in time")}catch(t){console.error("Failed to start local server",t)}}async function me(){(0,L.execSync)(`pm2 logs ${c}`,{stdio:"inherit"})}async function fe(){await R()}function ue(){console.log(`DataRamen CLI version: ${A().version}`),console.log(`DataRamen local server version: ${v().version}`)}async function pe(){let e=a.getNumber("PORT");await(0,x.default)(`http://localhost:${e}`)}var g={start:le,logs:me,stop:fe,version:ue,open:pe};(0,B.default)((0,G.hideBin)(process.argv)).command("start","Default command, start/restart the server",g.start).command(["logs"],"Listen for logs",g.logs).command("stop","Stop the server",g.stop).command("open","Stop the server",g.open).command(["version"],"Show version",g.version).parse();
@@ -0,0 +1 @@
1
+ "use strict";var s=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var t=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var c=(r,e)=>{for(var a in e)s(r,a,{get:e[a],enumerable:!0})},l=(r,e,a,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of t(e))!p.call(r,n)&&n!==a&&s(r,n,{get:()=>e[n],enumerable:!(o=m(e,n))||o.enumerable});return r};var d=r=>l(s({},"__esModule",{value:!0}),r);var w={};c(w,{UsersManagement1755358316764:()=>i});module.exports=d(w);var u=require("typeorm"),i=class{name="UsersManagement1755358316764";async up(e){await e.addColumns("users",[new u.TableColumn({name:"username",type:"varchar",isUnique:!0}),new u.TableColumn({name:"password",type:"varchar"})])}async down(e){await e.dropColumns("users",["username","password"])}};0&&(module.exports={UsersManagement1755358316764});
@@ -1,9 +1,9 @@
1
- "use strict";var Qt=Object.create;var Re=Object.defineProperty;var kt=Object.getOwnPropertyDescriptor;var $t=Object.getOwnPropertyNames;var Bt=Object.getPrototypeOf,Ht=Object.prototype.hasOwnProperty;var F=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Yt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of $t(t))!Ht.call(e,a)&&a!==r&&Re(e,a,{get:()=>t[a],enumerable:!(o=kt(t,a))||o.enumerable});return e};var R=(e,t,r)=>(r=e!=null?Qt(Bt(e)):{},Yt(t||!e||!e.__esModule?Re(r,"default",{value:e,enumerable:!0}):r,e));var mt=F(lt=>{"use strict";Object.defineProperty(lt,"__esModule",{value:!0})});var ye=F(X=>{"use strict";Object.defineProperty(X,"__esModule",{value:!0});X.PostgreSqlFunctions=void 0;var J=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`};X.PostgreSqlFunctions={YEAR:e=>`EXTRACT(YEAR FROM ${e.value})`,MONTH:e=>`EXTRACT(MONTH FROM ${e.value})`,DAY:e=>`EXTRACT(DAY FROM ${e.value})`,SUM:e=>`COALESCE(SUM(${e.distinct===!0?"distinct ":""}${e.value}), 0)`,AVG:J,MAX:J,MIN:J,COUNT:J}});var Te=F(ee=>{"use strict";Object.defineProperty(ee,"__esModule",{value:!0});ee.MySqlColumnFunctions=void 0;var Z=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`};ee.MySqlColumnFunctions={YEAR:e=>`YEAR(${e.value})`,MONTH:e=>`MONTH(${e.value})`,DAY:e=>`DAY(${e.value})`,SUM:e=>{let t=e.distinct===!0?"distinct ":"";return`coalesce(${e.fn}(${t}${e.value}), 0)`},AVG:Z,MAX:Z,MIN:Z,COUNT:Z}});var ge=F(y=>{"use strict";Object.defineProperty(y,"__esModule",{value:!0});y.transformColumn=y.isAggregationFunction=y.isAllowedFunction=y.ALLOWED_AGGREGATION_FUNCTIONS=y.ALLOWED_COLUMN_FUNCTIONS=y.COLUMN_FUNCTIONS=y.AGGREGATION_FUNCTIONS=void 0;var Tr=ye(),gr=Te();y.AGGREGATION_FUNCTIONS=["SUM","COUNT","AVG","MAX","MIN"];y.COLUMN_FUNCTIONS=["YEAR","MONTH","DAY",...y.AGGREGATION_FUNCTIONS];y.ALLOWED_COLUMN_FUNCTIONS=y.COLUMN_FUNCTIONS.reduce((e,t)=>(e[t]=!0,e),{});y.ALLOWED_AGGREGATION_FUNCTIONS=y.AGGREGATION_FUNCTIONS.reduce((e,t)=>(e[t]=!0,e),{});var hr=e=>y.ALLOWED_COLUMN_FUNCTIONS[e];y.isAllowedFunction=hr;var Er=e=>y.ALLOWED_AGGREGATION_FUNCTIONS[e];y.isAggregationFunction=Er;var wr=(e,t)=>e.fn&&(0,y.isAllowedFunction)(e.fn)?(t==="postgres"?Tr.PostgreSqlFunctions:gr.MySqlColumnFunctions)[e.fn](e):e.value;y.transformColumn=wr});var he=F(U=>{"use strict";Object.defineProperty(U,"__esModule",{value:!0});U.buildQueryFilterCondition=U.buildSelect=U.isString=void 0;var br=ge(),Sr=e=>typeof e=="string";U.isString=Sr;var Ir=e=>{let t="SELECT ";if(e.columns&&e.columns.length>0?t+=e.columns.join(", "):t+="*",e.table&&(t+=` FROM ${e.table}`),e.joins&&e.joins.length>0&&e.joins.forEach(r=>{t+=` ${r.type} JOIN ${r.table} ON ${r.on}`}),e.where&&(t+=` WHERE ${e.where}`),e.groupBy&&e.groupBy.length>0&&(t+=` GROUP BY ${e.groupBy.join(", ")}`),e.having&&(t+=` HAVING ${e.having}`),e.orderBy&&e.orderBy.length>0){let r=e.orderBy.reduce((a,n)=>(a[n.column]=n.direction,a),{}),o=Object.entries(r).map(([a,n])=>`${a} ${n}`);t+=` ORDER BY ${o.join(", ")}`}return e.limit!==void 0&&(t+=` LIMIT ${e.limit}`),e.offset!==void 0&&(t+=` OFFSET ${e.offset}`),t};U.buildSelect=Ir;var Rr=(e,t)=>{let{column:r,operator:o,value:a,fn:n}=e,i=(0,br.transformColumn)({value:r,fn:n},t);switch(o){case"IS NULL":case"IS NOT NULL":return`${i} ${o}`;case"IN":case"NOT IN":let u=a?.map(f=>(0,U.isString)(f.value)?`'${f.value}'`:f.value).join(", ");return`${i} ${o} (${u})`;case"LIKE":return`${i} ${t==="postgres"?"ILIKE":"LIKE"} '%${a?.[0].value}%'`;case"NOT LIKE":return`${i} ${t==="postgres"?"NOT ILIKE":"LIKE"} '%${a?.[0].value}%'`;default:let l=a?.[0],h;return(0,U.isString)(l?.value)&&l?.isColumn!==!0?h=`'${l?.value}'`:h=l?.value,`${i} ${o} ${h}`}};U.buildQueryFilterCondition=Rr});var dt=F(te=>{"use strict";Object.defineProperty(te,"__esModule",{value:!0});te.SelectQueryBuilder=void 0;var Ee=he(),we=class{constructor(t="mysql"){this.dialect=t,this.skeleton={type:"SELECT"}}addWhere(t){let r=(0,Ee.buildQueryFilterCondition)(t,this.dialect);if(this.skeleton.where){let o=t.connector||"AND";this.skeleton.where+=` ${o} ${r}`}else this.skeleton.where=r;return this}addWhereRaw(t,r="AND"){return this.skeleton.where?this.skeleton.where+=` ${r} ${t}`:this.skeleton.where=t,this}clearWhere(){return this.skeleton.where=void 0,this}addHaving(t){let r=(0,Ee.buildQueryFilterCondition)(t,this.dialect);if(this.skeleton.having){let o=t.connector||"AND";this.skeleton.having+=` ${o} ${r}`}else this.skeleton.having=r;return this}clearHaving(){return this.skeleton.having=void 0,this}addOrderBy(...t){return this.skeleton.orderBy||(this.skeleton.orderBy=[]),this.skeleton.orderBy.push(...t),this}clearOrderBy(){return this.skeleton.orderBy=void 0,this}setLimit(t){return this.skeleton.limit=t,this}setOffset(t){return this.skeleton.offset=t,this}addGroupBy(t){this.skeleton.groupBy||(this.skeleton.groupBy=[]);let r=this.skeleton.groupBy.findIndex(o=>o===t);return r>-1?this.skeleton.groupBy[r]=t:this.skeleton.groupBy.push(t),this}setTable(t){return this.skeleton.table=t,this}addJoin(...t){return this.skeleton.joins||(this.skeleton.joins=[]),this.skeleton.joins.push(...t),this}selectColumns(t){if(this.skeleton.type!=="SELECT")throw new Error("Column selection is only supported for SELECT queries");return this.skeleton.columns=t,this}toSQL(){return(0,Ee.buildSelect)(this.skeleton)}};te.SelectQueryBuilder=we});var be=F(v=>{"use strict";var Nr=v&&v.__createBinding||(Object.create?function(e,t,r,o){o===void 0&&(o=r);var a=Object.getOwnPropertyDescriptor(t,r);(!a||("get"in a?!t.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,o,a)}:function(e,t,r,o){o===void 0&&(o=r),e[o]=t[r]}),re=v&&v.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&Nr(t,e,r)};Object.defineProperty(v,"__esModule",{value:!0});re(mt(),v);re(dt(),v);re(he(),v);re(ge(),v)});var K=require("dotenv"),j=require("node:path"),Ne=require("node:fs"),Gt=(()=>{try{let e=(0,Ne.readFileSync)((0,j.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})();(0,K.config)({path:[(0,j.join)(__dirname,"..","env",".env"),(0,j.join)(__dirname,"..","env",".env.default")]});(0,K.populate)(process.env,{SERVER_VERSION:Gt.version});var jt=["SYMM_ENCRYPTION_KEY","JWT_SECRET","JWT_REFRESH_SECRET"],_e=()=>{let e=[];for(let t of jt)process.env[t]||e.push(t);if(e.length>0)throw new Error("Following env variables are required but not provided: "+e.join(", "))};function Kt(e,t=void 0){return process.env[e]||t}function Wt(e,t=void 0){let r=process.env[e];if(!r)return t;let o=Number(r);return!isNaN(o)&&r.trim()!==""?o:t}function Vt(e){return process.env[e]==="true"||process.env[e]==="TRUE"}var m={str:Kt,num:Wt,bool:Vt};var Ut=R(require("fastify")),vt=R(require("@fastify/cors")),Mt=R(require("@fastify/static"));var s=class extends Error{constructor(r,o){super(o);this.status=r;this.message=o}};var Me=require("typeorm");var Ce=require("typeorm");var g=m.str("APP_DB_TYPE")==="sqlite"?"datetime":"timestamp";var ae=new Ce.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:g,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:g,default:()=>"CURRENT_TIMESTAMP"}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var Ae=require("typeorm");var ne=new Ae.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:g,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:g,default:()=>"CURRENT_TIMESTAMP"}},relations:{users:{type:"one-to-many",target:()=>"UsersToTeams",inverseSide:"team"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"team"},datasources:{type:"one-to-many",target:()=>"DataSource",inverseSide:"team"}}});var Oe=require("typeorm");var se=new Oe.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:g,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:g,default:()=>"CURRENT_TIMESTAMP"}},relations:{teams:{type:"one-to-many",target:()=>"UsersToTeams",inverseSide:"user"},settings:{type:"one-to-one",target:()=>"UserSettings",inverseSide:"user"},currentTeam:{type:"one-to-one",target:()=>"UsersToTeams",inverseSide:"user",joinColumn:!0}}});var Pe=require("typeorm");var ie=new Pe.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:g,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:g,default:()=>"CURRENT_TIMESTAMP"}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var De=require("typeorm");var ue=new De.EntitySchema({name:"DataSource",tableName:"data_sources",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},dbUrl:{type:String},dbPort:{type:Number,nullable:!0},dbUser:{type:String},dbPassword:{type:String,nullable:!0,select:!1},dbPasswordIv:{type:String,nullable:!0,select:!1},dbPasswordTag:{type:String,nullable:!0,select:!1},dbType:{type:String},createdAt:{type:g,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:g,default:()=>"CURRENT_TIMESTAMP"},name:{type:String},description:{type:String,nullable:!0},dbDatabase:{type:String},dbSchema:{type:String,nullable:!0},allowInsert:{type:Boolean,default:!1},allowUpdate:{type:Boolean,default:!1},lastInspected:{type:g,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 xe=R(require("node:os")),Le=require("node:path");var Ue=require("typeorm");var ce=new Ue.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",default:"{}"},isTrash:{type:Boolean,default:!1,nullable:!0},createdAt:{type:g,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:g,default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"queries",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",inverseSide:"datasources",joinColumn:!0}}});var ve=require("typeorm"),le=new ve.EntitySchema({name:"UsersToTeams",tableName:"users_to_teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},role:{type:"varchar",default:"admin",nullable:!1}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"users"},user:{type:"many-to-one",target:()=>"User",inverseSide:"teams"}}});function zt(){let e=m.str("APP_DB_DATABASE");if(!e)throw new Error("Bad value for TYPEORM_DATABASE. Please check your config!");return e.startsWith("<home>")&&(e=e.replace("<home>",xe.default.homedir())),e}var S=new Me.DataSource({type:m.str("APP_DB_TYPE"),database:zt(),host:m.str("APP_DB_HOST"),username:m.str("APP_DB_USERNAME"),password:m.str("APP_DB_PASSWORD"),port:m.num("APP_DB_PORT"),schema:m.str("APP_DB_SCHEMA"),logging:m.bool("APP_DB_LOGGING"),migrationsRun:!0,migrations:[Le.posix.join(__dirname,"migrations","*.js")],entities:[ae,ue,ne,se,le,ie,ce]}),Fe=async()=>{if(!S.isInitialized)return S.initialize();throw new Error("Already initialized")},P=S.getRepository(ae),T=S.getRepository(ue),q=S.getRepository(ne),N=S.getRepository(se),D=S.getRepository(le),$=S.getRepository(ie),_=S.getRepository(ce);var me=R(require("node:fs/promises")),qe=require("node:path"),Qe=R(require("node:os")),Jt=Qe.default.homedir(),ke=(0,qe.join)(Jt,".dataramen",".runtime","files"),$e=async()=>{await Xt()||await me.default.mkdir(ke,{recursive:!0})};async function Xt(){try{return(await me.default.lstat(ke)).isDirectory()}catch{return!1}}var w=e=>(t,r,o)=>{e(t),o()};var Y=require("jose");var Be=new TextEncoder,He=Be.encode(m.str("JWT_SECRET")),Ye=Be.encode(m.str("JWT_REFRESH_SECRET")),de=async({userId:e})=>new Y.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign(He),pe=async({userId:e})=>new Y.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign(Ye),Ge=async(e,t)=>{try{let{payload:r}=await(0,Y.jwtVerify)(e,t);if(!r.sub)throw new s(401,"Failed to verify access token");return{userId:r.sub}}catch(r){throw r instanceof s?r:r instanceof Error?new s(401,r.message):new s(401,"Failed to verify refresh token")}},je=async e=>Ge(e,He),Ke=async e=>Ge(e,Ye);var Zt=async()=>{let e=await q.save(q.create({name:"Personal"})),t=await N.save(N.create({})),r=await D.save(D.create({user:t,team:e,role:"admin"}));return await N.update(t.id,{currentTeam:r}),N.findOne({where:{}})},We={httpOnly:!0,secure:m.bool("PROD"),sameSite:m.bool("PROD"),path:"/",maxAge:10*24*60*60},Ve=w(e=>{e.route({method:"post",url:"/login",config:{isPublic:!0},handler:async(t,r)=>{let o=await N.findOne({where:{}});o||(o=await Zt());let[a,n]=await Promise.all([de({userId:o?.id}),pe({userId:o?.id})]);return r.setCookie("refreshToken",n,We),{data:{accessToken:a}}}}),e.route({method:"post",url:"/refresh",config:{isPublic:!0},handler:async(t,r)=>{let o=t.cookies.refreshToken;if(!o)return r.code(401).send({message:"Missing refresh token"});let{userId:a}=await Ke(o),[n,i]=await Promise.all([de({userId:a}),pe({userId:a})]);return r.setCookie("refreshToken",i,We),{data:{accessToken:n}}}}),e.route({method:"post",url:"/logout",config:{isPublic:!0},handler:async(t,r)=>(r.clearCookie("refreshToken",{path:"/"}),{data:!0})})});var b=(e,t)=>{let r=e.body;return t&&t(r),r},B=(e,t)=>{let r=e.query;return t&&t(r),r},C=(e,t)=>{let r=e.params;return t&&t(r),r};var ze=e=>{if(!e.dbUrl)throw new s(400,"url is required");if(!e.dbUser)throw new s(400,"user is required");if(!e.dbType)throw new s(400,"type is required");if(!e.name)throw new s(400,"name is required");if(!e.dbDatabase)throw new s(400,"database is required")};var Xe=R(require("mysql2/promise"));var er=({database:e,password:t,user:r,url:o})=>Xe.default.createConnection({host:o,user:r,database:e,password:t}),tr=async e=>{let t=`
1
+ "use strict";var Mt=Object.create;var he=Object.defineProperty;var vt=Object.getOwnPropertyDescriptor;var Lt=Object.getOwnPropertyNames;var Ft=Object.getPrototypeOf,Qt=Object.prototype.hasOwnProperty;var qt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of Lt(t))!Qt.call(e,a)&&a!==r&&he(e,a,{get:()=>t[a],enumerable:!(o=vt(t,a))||o.enumerable});return e};var A=(e,t,r)=>(r=e!=null?Mt(Ft(e)):{},qt(t||!e||!e.__esModule?he(r,"default",{value:e,enumerable:!0}):r,e));var K=require("dotenv"),G=require("node:path"),ge=require("node:fs"),kt=(()=>{try{let e=(0,ge.readFileSync)((0,G.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})();(0,K.config)({path:[(0,G.join)(__dirname,"..","env",".env"),(0,G.join)(__dirname,"..","env",".env.default")]});(0,K.populate)(process.env,{SERVER_VERSION:kt.version});var Bt=["SYMM_ENCRYPTION_KEY","JWT_SECRET","JWT_REFRESH_SECRET"],we=()=>{let e=[];for(let t of Bt)process.env[t]||e.push(t);if(e.length>0)throw new Error("Following env variables are required but not provided: "+e.join(", "))};function $t(e,t=void 0){return process.env[e]||t}function Ht(e,t=void 0){let r=process.env[e];if(!r)return t;let o=Number(r);return!isNaN(o)&&r.trim()!==""?o:t}function Yt(e){return process.env[e]==="true"||process.env[e]==="TRUE"}var m={str:$t,num:Ht,bool:Yt};var Gn=require("reflect-metadata"),At=A(require("fastify")),Ot=A(require("@fastify/cors")),_t=A(require("@fastify/static"));var s=class extends Error{constructor(r,o){super(o);this.status=r;this.message=o}};var Ae=require("typeorm");var Ee=require("typeorm");var y=m.str("APP_DB_TYPE")==="sqlite"?"datetime":"timestamp";var ae=new Ee.EntitySchema({name:"DatabaseInspection",tableName:"db_inspection",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},tableName:{nullable:!0,type:String},columns:{type:"json",nullable:!0},createdAt:{type:y,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:y,default:()=>"CURRENT_TIMESTAMP"}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var Se=require("typeorm");var ne=new Se.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:y,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:y,default:()=>"CURRENT_TIMESTAMP"}},relations:{users:{type:"one-to-many",target:()=>"UsersToTeams",inverseSide:"team"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"team"},datasources:{type:"one-to-many",target:()=>"DataSource",inverseSide:"team"}}});var Re=require("typeorm");var se=new Re.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:y,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:y,default:()=>"CURRENT_TIMESTAMP"},username:{type:String,unique:!0},password:{type:String}},relations:{teams:{type:"one-to-many",target:()=>"UsersToTeams",inverseSide:"user"},settings:{type:"one-to-one",target:()=>"UserSettings",inverseSide:"user"},currentTeam:{type:"one-to-one",target:()=>"UsersToTeams",inverseSide:"user",joinColumn:!0}}});var be=require("typeorm");var ie=new be.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:y,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:y,default:()=>"CURRENT_TIMESTAMP"}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var Ne=require("typeorm");var ue=new Ne.EntitySchema({name:"DataSource",tableName:"data_sources",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},dbUrl:{type:String},dbPort:{type:Number,nullable:!0},dbUser:{type:String},dbPassword:{type:String,nullable:!0,select:!1},dbPasswordIv:{type:String,nullable:!0,select:!1},dbPasswordTag:{type:String,nullable:!0,select:!1},dbType:{type:String},createdAt:{type:y,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:y,default:()=>"CURRENT_TIMESTAMP"},name:{type:String},description:{type:String,nullable:!0},dbDatabase:{type:String},dbSchema:{type:String,nullable:!0},allowInsert:{type:Boolean,default:!1},allowUpdate:{type:Boolean,default:!1},lastInspected:{type:y,nullable:!0,default:null},status:{type:String,nullable:!0}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"datasources",joinColumn:!0},inspections:{type:"one-to-many",target:()=>"DatabaseInspection",inverseSide:"datasource"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"dataSource"},owner:{type:"many-to-one",target:()=>"User",joinColumn:!0}}});var Oe=A(require("node:os")),_e=require("node:path");var Ie=require("typeorm");var ce=new Ie.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",default:"{}"},isTrash:{type:Boolean,default:!1,nullable:!0},createdAt:{type:y,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:y,default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"queries",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",inverseSide:"datasources",joinColumn:!0}}});var Ce=require("typeorm"),me=new Ce.EntitySchema({name:"UsersToTeams",tableName:"users_to_teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},role:{type:"varchar",default:"admin",nullable:!1}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"users"},user:{type:"many-to-one",target:()=>"User",inverseSide:"teams"}}});function Gt(){let e=m.str("APP_DB_DATABASE");if(!e)throw new Error("Bad value for TYPEORM_DATABASE. Please check your config!");return e.startsWith("<home>")&&(e=e.replace("<home>",Oe.default.homedir())),e}var R=new Ae.DataSource({type:m.str("APP_DB_TYPE"),database:Gt(),host:m.str("APP_DB_HOST"),username:m.str("APP_DB_USERNAME"),password:m.str("APP_DB_PASSWORD"),port:m.num("APP_DB_PORT"),schema:m.str("APP_DB_SCHEMA"),logging:m.bool("APP_DB_LOGGING"),migrationsRun:!0,migrations:[_e.posix.join(__dirname,"migrations","*.js")],entities:[ae,ue,ne,se,me,ie,ce]}),Pe=async()=>{if(!R.isInitialized)return R.initialize();throw new Error("Already initialized")},_=R.getRepository(ae),f=R.getRepository(ue),x=R.getRepository(ne),S=R.getRepository(se),P=R.getRepository(me),L=R.getRepository(ie),N=R.getRepository(ce);var le=A(require("node:fs/promises")),De=require("node:path"),Ue=A(require("node:os")),Kt=Ue.default.homedir(),xe=(0,De.join)(Kt,".dataramen",".runtime","files"),Me=async()=>{await jt()||await le.default.mkdir(xe,{recursive:!0})};async function jt(){try{return(await le.default.lstat(xe)).isDirectory()}catch{return!1}}var E=e=>(t,r,o)=>{e(t),o()};var q=require("jose");var ve=new TextEncoder,Le=ve.encode(m.str("JWT_SECRET")),Fe=ve.encode(m.str("JWT_REFRESH_SECRET")),de=async({userId:e})=>new q.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign(Le),pe=async({userId:e})=>new q.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign(Fe),Qe=async(e,t)=>{try{let{payload:r}=await(0,q.jwtVerify)(e,t);if(!r.sub)throw new s(401,"Failed to verify access token");return{userId:r.sub}}catch(r){throw r instanceof s?r:r instanceof Error?new s(401,r.message):new s(401,"Failed to verify refresh token")}},qe=async e=>Qe(e,Le),ke=async e=>Qe(e,Fe);var T=(e,t)=>{let r=e.body;return t&&t(r),r},F=(e,t)=>{let r=e.query;return t&&t(r),r},I=(e,t)=>{let r=e.params;return t&&t(r),r};var $e=A(require("bcryptjs"));var Be=e=>{if(!e?.username)throw new s(400,"Username is required");if(!e?.password)throw new s(400,"Password is required")};var j="DATARAMEN_refresh_token",fe={httpOnly:!0,secure:m.bool("PROD"),sameSite:m.bool("PROD"),path:"/",maxAge:10*24*60*60},He=E(e=>{e.route({method:"post",url:"/login",config:{isPublic:!0},handler:async(t,r)=>{let{username:o,password:a}=T(t,Be),n=await S.findOne({where:{username:o}});if(!n||!$e.default.compareSync(a,n.password))throw new s(401,"Invalid credentials");let[i,u]=await Promise.all([de({userId:n?.id}),pe({userId:n?.id})]);return r.setCookie(j,u,fe),{data:{accessToken:i}}}}),e.route({method:"post",url:"/refresh",config:{isPublic:!0},handler:async(t,r)=>{let o=t.cookies[j];if(!o)return r.code(401).send({message:"Missing refresh token"});let{userId:a}=await ke(o),[n,i]=await Promise.all([de({userId:a}),pe({userId:a})]);return r.setCookie(j,i,fe),{data:{accessToken:n}}}}),e.route({method:"post",url:"/logout",config:{isPublic:!0},handler:async(t,r)=>(r.clearCookie(j,fe),{data:!0})})});var Ye=e=>{if(!e.dbUrl)throw new s(400,"url is required");if(!e.dbUser)throw new s(400,"user is required");if(!e.dbType)throw new s(400,"type is required");if(!e.name)throw new s(400,"name is required");if(!e.dbDatabase)throw new s(400,"database is required")};var Ke=A(require("mysql2/promise"));var Wt=({database:e,password:t,user:r,url:o})=>Ke.default.createConnection({host:o,user:r,database:e,password:t}),Vt=async e=>{let t=`
2
2
  SELECT TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION
3
3
  FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
4
4
  WHERE CONSTRAINT_NAME = 'PRIMARY'
5
5
  ORDER BY TABLE_NAME, ORDINAL_POSITION;
6
- `,[r]=await e.execute(t),o={};return r.forEach(a=>{let n=a.TABLE_NAME,i=a.COLUMN_NAME;o[n]||(o[n]=[]),o[n].push(i)}),o},rr=async e=>{let t=`
6
+ `,[r]=await e.execute(t),o={};return r.forEach(a=>{let n=a.TABLE_NAME,i=a.COLUMN_NAME;o[n]||(o[n]=[]),o[n].push(i)}),o},zt=async e=>{let t=`
7
7
  SELECT
8
8
  TABLE_NAME AS table_name,
9
9
  COLUMN_NAME AS field,
@@ -14,7 +14,7 @@
14
14
  WHERE
15
15
  REFERENCED_TABLE_NAME IS NOT NULL
16
16
  AND CONSTRAINT_SCHEMA = DATABASE();
17
- `,[r]=await e.execute(t),o={};return Array.isArray(r)&&r.forEach(a=>{o[a.table_name]||(o[a.table_name]={}),o[a.table_name][a.field]={refTable:a.referenced_table,refField:a.referenced_field}}),o},or=async(e,t)=>{let o=(await t.query("SHOW TABLES"))[0],a=await rr(t),n=await tr(t),i=o.map(async u=>{let d=Object.values(u)[0],c=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${e.database}' and table_name = '${d}'`,[l]=await t.query(c),h=a[d];return{columns:l.map(f=>({name:f.COLUMN_NAME,type:f.DATA_TYPE,isPrimary:n[d]?.includes(f.COLUMN_NAME),ref:h?.[f.COLUMN_NAME]?{table:h[f.COLUMN_NAME].refTable,field:h[f.COLUMN_NAME].refField}:void 0})).sort((f,E)=>f.isPrimary&&E.isPrimary?f.name.localeCompare(E.name):f.isPrimary?-1:1),createdAt:new Date,tableName:d,updatedAt:new Date}});return Promise.all(i)},Je=async(e,t,r)=>{try{console.log(`[MYSQL CONN] Query: ${e}`);let[o,a]=await t.query({sql:e,rowsAsArray:!0}),n=o?.constructor?.name;if(n==="ResultSetHeader"){let i=o;if(i.affectedRows>1&&r.allowBulkUpdate!==!0)throw new Error("[MYSQL CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[i.affectedRows]],query:e}}else if(n==="Array"){let i=o;return{columns:a?.map(u=>({column:u.orgName||u.name,table:u.orgTable,alias:u.name,full:u.orgTable?u.orgTable+"."+u.orgName:u.name}))||[],rows:i,query:e}}throw new Error(`[MYSQL CONN] Unknown result type: ${n}`)}catch(o){throw console.error(o),o instanceof s?o:new s(400,o.message)}},ar=async(e,t)=>{await e.beginTransaction();try{let r=await t();return await e.commit(),console.log("[MYSQL CONN] Commit"),r}catch(r){throw await e.rollback(),console.warn(r.message),console.log("[MYSQL CONN] Rollback"),r}},nr=async(e,t)=>{await e.query("START TRANSACTION READ ONLY");try{let r=await t();return console.log("[MYSQL CONN] Read only rollback"),await e.query("ROLLBACK"),r}catch(r){throw console.warn(r.message),await e.query("ROLLBACK"),r}},Ze=async e=>{let t=await er(e),r=!1;return{dbType:"mysql",dataSource:e,inspectSchema:()=>or(e,t),executeQuery:(o,a)=>a.type==="SELECT"?nr(t,()=>Je(o,t,a)):ar(t,()=>Je(o,t,a)),checkConnection:async()=>t.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.destroy()}}};var tt=R(require("pg"));var sr=async({database:e,password:t,user:r,url:o,port:a})=>{let n=new tt.default.Client({host:o,user:r,database:e,password:t,port:a,query_timeout:1e4});return await n.connect(),n},ir=async e=>{let r=await e.query(`
17
+ `,[r]=await e.execute(t),o={};return Array.isArray(r)&&r.forEach(a=>{o[a.table_name]||(o[a.table_name]={}),o[a.table_name][a.field]={refTable:a.referenced_table,refField:a.referenced_field}}),o},Jt=async(e,t)=>{let o=(await t.query("SHOW TABLES"))[0],a=await zt(t),n=await Vt(t),i=o.map(async u=>{let l=Object.values(u)[0],c=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${e.database}' and table_name = '${l}'`,[h]=await t.query(c),g=a[l];return{columns:h.map(p=>({name:p.COLUMN_NAME,type:p.DATA_TYPE,isPrimary:n[l]?.includes(p.COLUMN_NAME),ref:g?.[p.COLUMN_NAME]?{table:g[p.COLUMN_NAME].refTable,field:g[p.COLUMN_NAME].refField}:void 0})).sort((p,w)=>p.isPrimary&&w.isPrimary?p.name.localeCompare(w.name):p.isPrimary?-1:1),createdAt:new Date,tableName:l,updatedAt:new Date}});return Promise.all(i)},Ge=async(e,t,r)=>{try{console.log(`[MYSQL CONN] Query: ${e}`);let[o,a]=await t.query({sql:e,rowsAsArray:!0}),n=o?.constructor?.name;if(n==="ResultSetHeader"){let i=o;if(i.affectedRows>1&&r.allowBulkUpdate!==!0)throw new Error("[MYSQL CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[i.affectedRows]],query:e}}else if(n==="Array"){let i=o;return{columns:a?.map(u=>({column:u.orgName||u.name,table:u.orgTable,alias:u.name,full:u.orgTable?u.orgTable+"."+u.orgName:u.name}))||[],rows:i,query:e}}throw new Error(`[MYSQL CONN] Unknown result type: ${n}`)}catch(o){throw console.error(o),o instanceof s?o:new s(400,o.message)}},Xt=async(e,t)=>{await e.beginTransaction();try{let r=await t();return await e.commit(),console.log("[MYSQL CONN] Commit"),r}catch(r){throw await e.rollback(),console.warn(r.message),console.log("[MYSQL CONN] Rollback"),r}},Zt=async(e,t)=>{await e.query("START TRANSACTION READ ONLY");try{let r=await t();return console.log("[MYSQL CONN] Read only rollback"),await e.query("ROLLBACK"),r}catch(r){throw console.warn(r.message),await e.query("ROLLBACK"),r}},je=async e=>{let t=await Wt(e),r=!1;return{dbType:"mysql",dataSource:e,inspectSchema:()=>Jt(e,t),executeQuery:(o,a)=>a.type==="SELECT"?Zt(t,()=>Ge(o,t,a)):Xt(t,()=>Ge(o,t,a)),checkConnection:async()=>t.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.destroy()}}};var Ve=A(require("pg"));var er=async({database:e,password:t,user:r,url:o,port:a})=>{let n=new Ve.default.Client({host:o,user:r,database:e,password:t,port:a,query_timeout:1e4});return await n.connect(),n},tr=async e=>{let r=await e.query(`
18
18
  SELECT
19
19
  kcu.table_name,
20
20
  kcu.column_name,
@@ -28,7 +28,7 @@
28
28
  tc.constraint_type = 'PRIMARY KEY'
29
29
  ORDER BY
30
30
  kcu.table_name, kcu.ordinal_position;
31
- `),o={};return r.rows.forEach(a=>{let n=a.table_name,i=a.column_name;o[n]||(o[n]=[]),o[n].push(i)}),o},ur=async e=>{let r=await e.query(`
31
+ `),o={};return r.rows.forEach(a=>{let n=a.table_name,i=a.column_name;o[n]||(o[n]=[]),o[n].push(i)}),o},rr=async e=>{let r=await e.query(`
32
32
  SELECT
33
33
  tc.table_name AS table_name,
34
34
  kcu.column_name AS field,
@@ -43,15 +43,15 @@
43
43
  ON ccu.constraint_name = tc.constraint_name
44
44
  AND ccu.table_schema = tc.table_schema
45
45
  WHERE tc.constraint_type = 'FOREIGN KEY';
46
- `),o={};return r.rows.forEach(a=>{o[a.table_name]||(o[a.table_name]={}),o[a.table_name][a.field]={refTable:a.referenced_table,refField:a.referenced_field}}),o},cr=async(e,t)=>{let r=`SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = '${e.schema}'`,a=(await t.query(r)).rows,n=await ur(t),i=await ir(t),u=a.map(async d=>{let c=Object.values(d)[0],l=`
46
+ `),o={};return r.rows.forEach(a=>{o[a.table_name]||(o[a.table_name]={}),o[a.table_name][a.field]={refTable:a.referenced_table,refField:a.referenced_field}}),o},or=async(e,t)=>{let r=`SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = '${e.schema}'`,a=(await t.query(r)).rows,n=await rr(t),i=await tr(t),u=a.map(async l=>{let c=Object.values(l)[0],h=`
47
47
  SELECT column_name, data_type
48
48
  FROM information_schema.columns
49
49
  WHERE
50
50
  table_name = '${c}' and
51
51
  table_schema = '${e.schema}'
52
- `,{rows:h}=await t.query(l),f=n[c];return{columns:h.map(E=>({name:E.column_name,type:E.data_type,isPrimary:i[c]?.includes(E.column_name),ref:f?.[E.column_name]?{table:f[E.column_name].refTable,field:f[E.column_name].refField}:void 0})).sort((E,I)=>E.isPrimary&&I.isPrimary?E.name.localeCompare(I.name):E.isPrimary?-1:1),createdAt:new Date,tableName:c,updatedAt:new Date}});return Promise.all(u)},lr=async(e,t)=>{let r=`select relname, attname, concat(pg_class.oid, '-', attnum) as row_key
52
+ `,{rows:g}=await t.query(h),p=n[c];return{columns:g.map(w=>({name:w.column_name,type:w.data_type,isPrimary:i[c]?.includes(w.column_name),ref:p?.[w.column_name]?{table:p[w.column_name].refTable,field:p[w.column_name].refField}:void 0})).sort((w,b)=>w.isPrimary&&b.isPrimary?w.name.localeCompare(b.name):w.isPrimary?-1:1),createdAt:new Date,tableName:c,updatedAt:new Date}});return Promise.all(u)},ar=async(e,t)=>{let r=`select relname, attname, concat(pg_class.oid, '-', attnum) as row_key
53
53
  from pg_attribute
54
54
  left join pg_class on pg_attribute.attrelid = pg_class.oid
55
55
  where
56
56
  concat(pg_class.oid, '-', attnum) IN (${e.join(", ")})
57
- limit 25;`;return(await t.query(r)).rows.reduce((a,n)=>(a[n.row_key]={table:n.relname,column:n.attname},a),{})},et=async(e,t,r)=>{try{console.log(`[PG CONN] Query: ${e}`);let{rows:o,fields:a,command:n,rowCount:i}=await t.query({text:e,rowMode:"array"});if(n==="UPDATE"||n==="INSERT"||n==="DELETE"){if(i!=null&&i>1&&r.allowBulkUpdate!==!0)throw new Error("[PG CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[i]],query:e}}if(n==="SELECT"){let u=a.map(c=>`'${c.tableID}-${c.columnID}'`),d=await lr(u,t);return{columns:a.map(c=>{let l=d[`${c.tableID}-${c.columnID}`];return{column:l?.column||c.name,alias:c.name,table:l?.table||"",full:l?l.table+"."+l.column:c.name}}),rows:o,query:e}}throw new Error(`[PG CONN] Unsupported command: ${n}`)}catch(o){throw o instanceof s?o:new s(400,o.message)}},mr=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}},dr=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}},rt=async e=>{let t=await sr(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:()=>cr(e,t),executeQuery:(n,i)=>a(()=>i.type==="SELECT"?dr(t,()=>et(n,t,i)):mr(t,()=>et(n,t,i))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.end()}}};var Q=async(e,t,r)=>{try{let o;if(t==="mysql")o=await Ze(e);else if(t==="postgres")o=await rt(e);else throw new s(500,`Connection manager for ${t} not found`);return r.__connections?r.__connections.push(o):r.__connections=[o],o}catch(o){throw console.error(o),o instanceof s?o:o?.code==="ECONNREFUSED"?new s(500,"Failed to connect to the database"):new s(500,o.message)}};var V=R(require("node:crypto"));var ot="aes-256-gcm",pr=12,at=()=>{let e=m.str("SYMM_ENCRYPTION_KEY");if(!e)throw new Error("Missing ENCRYPTION_KEY in environment variables.");let t=Buffer.from(e,"hex");if(t.length!==32)throw new Error("ENCRYPTION_KEY must be a 64-character hex string (256 bits).");return t},fr=e=>{let t=V.default.randomBytes(pr),r=at(),o=V.default.createCipheriv(ot,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")}},yr=({encrypted:e,iv:t,tag:r})=>{let o=at(),a=V.default.createDecipheriv(ot,o,Buffer.from(t,"hex"));a.setAuthTag(Buffer.from(r,"hex"));let n=a.update(e,"hex","utf8");return n+=a.final("utf8"),n},z={encrypt:fr,decrypt:yr};var k=(e,t=!1)=>{if(t){let r=z.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 A=(...e)=>(t,r,o)=>{if(!e.includes(t.user.currentTeamRole))throw new s(403,"You are not authorized to perform this action");o()};var nt=w(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=C(t),o=await T.findOne({where:{id:r}});if(!o)throw new s(404,"Data source not found");return{data:o}}}),e.route({method:"get",url:"/",handler:async t=>{let{teamId:r}=B(t);return{data:await T.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",preHandler:[A("admin")],handler:async t=>{let{teamId:r,ownerId:o,...a}=b(t,ze),n=T.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),i=await Q(k(n),n.dbType,t);try{await i.checkConnection()}catch{throw new s(400,"Cannot connect to the database, please check datasource configuration")}let{tag:u,iv:d,encrypted:c}=z.encrypt(n.dbPassword);return n.dbPassword=c,n.dbPasswordIv=d,n.dbPasswordTag=u,{data:await T.save(n)}}}),e.route({method:"put",url:"/:id",preHandler:[A("admin")],handler:async t=>{let{id:r}=C(t),o=b(t),a=await T.findOneBy({id:r});if(!a)throw new s(404,"Data source not found");let n=T.merge(a,o);return await T.save(n),{data:n}}}),e.route({method:"delete",url:"/:id",preHandler:[A("admin")],handler:async(t,r)=>S.transaction(async()=>{let{id:o}=C(t);await Promise.all([P.delete({datasource:{id:o}}),_.delete({dataSource:{id:o}})]),await T.delete({id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=C(t),a=await T.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 T.save(a);let i=await(await Q(k(a,!0),a.dbType,t)).inspectSchema();await P.delete({datasource:{id:o}}),await P.insert(i.sort().map(u=>P.create({tableName:u.tableName,columns:u.columns,datasource:{id:o}}))),a.status="READY",a.lastInspected=new Date,await T.save(a)}}),e.route({method:"get",url:"/:id/inspections",handler:async(t,r)=>{let{id:o}=C(t);return{data:await P.find({where:{datasource:{id:o}}})}}})});var fe=require("typeorm"),st=w(e=>{e.route({method:"get",url:"/team/:teamId/files",handler:async(t,r)=>{let{teamId:o}=C(t),a={where:{team:{id:o}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0}},[n=[],i=[]]=await Promise.all([T.find(a),_.find({...a,where:{...a.where,isTrash:!1}})]);return{data:[...n.map(u=>({...u,type:"dataSource"})),...i.map(u=>({...u,type:"query"}))]}}}),e.route({method:"get",url:"/team/:teamId/query",handler:async t=>{let{teamId:r}=C(t),{search:o,size:a}=B(t),n=(parseInt(a)||20)/2,[i,u]=await Promise.all([P.find({where:{tableName:(0,fe.Like)(`%${o}%`),datasource:{team:{id:r}}},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:n}),_.find({where:{name:(0,fe.Like)(`%${o}%`),isTrash:!1,dataSource:{team:{id:r}}},relations:{dataSource:!0},select:{id:!0,name:!0,dataSource:{name:!0,id:!0}},order:{name:"ASC"},take:n})]),d=[];return i.forEach(c=>{d.push({name:c.tableName,id:c.id,dataSourceName:c.datasource?.name||"--",dataSourceId:c.datasource?.id||"--",type:"table"})}),u.forEach(c=>{d.push({name:c.name,id:c.id,dataSourceName:c.dataSource?.name||"--",dataSourceId:c.dataSource?.id||"--",type:"query"})}),{data:d}}})});function it(e,t=void 0){try{if(e){let r=e.split("&"),o={};for(let a of r){let n=a.split(":");o[n[0]]=n[1]}return o}}catch{}return t}var ut=require("typeorm");var ct=w(e=>{e.route({method:"get",url:"/",handler:async t=>{let{dataSourceId:r,teamId:o,limit:a,orderBy:n,name:i}=B(t);if(!r&&!o)throw new s(400,"Either dsId or teamId is required");let u={isTrash:!1};return r&&(u.dataSource={id:r}),o&&(u.team={id:o}),i&&(u.name=(0,ut.Like)(`%${i}%`)),{data:await _.find({where:u,take:a,order:it(n,{createdAt:"DESC"})})}}}),e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=C(t),o=await _.findOne({where:{id:r},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return o?{data:o}:{status:404,data:"Query not found"}}}),e.route({method:"post",url:"/",preHandler:[A("admin","editor")],handler:async t=>{let r=b(t),o=await T.findOne({where:{id:r.dataSourceId},relations:{team:!0}}),a=await _.save(_.create({name:r.name,isTrash:!1,opts:r.opts,team:{id:o?.team.id},dataSource:{id:r.dataSourceId}}));return console.log("Created query!"),{data:a}}}),e.route({method:"patch",url:"/:id",preHandler:[A("admin","editor")],handler:async t=>{let{id:r}=C(t),o=b(t);if(!(await _.update(r,o)).affected)throw new s(404,"Query not found");return{data:await _.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",preHandler:[A("admin","editor")],handler:async t=>S.transaction(async()=>{let{id:r}=C(t);if(!(await _.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var M=R(be()),Tt=require("typeorm");var pt=[{value:"=",label:"equals"},{value:"<>",label:"not equal"},{value:">",label:"greater than"},{value:">=",label:"greater than or equal"},{value:"<",label:"less than"},{value:"<=",label:"less than or equal"},{value:"LIKE",label:"contains"},{value:"NOT LIKE",label:"not contains"},{value:"IN",label:"in list"},{value:"NOT IN",label:"not in list"},{value:"IS NULL",label:"is null"},{value:"IS NOT NULL",label:"is not null"}],_r=pt.reduce((e,t)=>(e[t.value]=t.label,e),{}),Da=pt.reduce((e,t)=>(e[t.label]=t.value,e),{}),H=e=>e.map(t=>({label:_r[t],value:t})),Ua=H(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),va=H(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),Ma=H(["=","<>","IS NULL","IS NOT NULL"]),xa=H(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),La=H(["IS NULL","IS NOT NULL"]),Fa=H(["IN","NOT IN"]);var ft=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"];var qa=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var yt=e=>e.fn?e.distinct===!0?`${e.fn} distinct ${e.value}`:`${e.fn} ${e.value}`:e.value;var Se=R(ye()),Ie=R(Te());var gt=async(e,{table:t,datasourceId:r,filters:o,joins:a,orderBy:n,size:i,page:u,columns:d,groupBy:c,searchAll:l})=>{let h=await T.findOne({where:{id:r},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]}),f=[t],E=[];if(!h)throw new s(404,"Data source not found");let I=new M.SelectQueryBuilder(h.dbType);I.setTable(t),I.setLimit(i||20),I.setOffset(i*u),o?.forEach(p=>{p.fn&&(0,M.isAggregationFunction)(p.fn)?I.addHaving(p):I.addWhere(p)}),a&&(I.addJoin(...a),a.forEach(p=>{f.push(p.table)})),n&&I.addOrderBy(...n.map(p=>({...p,column:Pr(p.column,h.dbType)}))),c&&c.length>0&&c.forEach(p=>I.addGroupBy(Or(p,h.dbType)));let qt=await P.find({where:{tableName:(0,Tt.In)(f),datasource:{id:r}}});for(let p of qt)if(p.columns)for(let L of p.columns)E.push({column:L.name,table:p.tableName||"",full:`${p.tableName}.${L.name}`,type:L.type});let G;if(d&&d.length>0?G=d.map(p=>Ar(p,h.dbType)):G=E.map(p=>`${p.full} as "${p.full}"`),I.selectColumns(G),l){let p=E.filter(L=>ft.includes(L.type)&&G.some(oe=>oe.startsWith(L.full)));if(p.length>0){let L=p.map(oe=>`LOWER(${oe.full}) LIKE '%${l.toLowerCase()}%'`);I.addWhereRaw(`(${L.join(" OR ")})`,"AND")}}return{...await(await Q(k(h,!0),h.dbType,e)).executeQuery(I.toSQL(),{type:"SELECT",allowBulkUpdate:!1}),tables:f,allColumns:E}},ht=async(e,t)=>{let r=await T.findOne({where:{id:t.datasourceId},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowUpdate"]});if(!r)throw new s(404,"Data source not found");if(!r.allowUpdate)throw new s(403,"This datasource does not allow update operations");let o=t.values.map(({value:u,column:d})=>typeof u=="string"?u&&u.startsWith("=")?`${d}=${u.substring(1)}`:`${d}='${u}'`:`${d}='${u}'`).join(", "),a=t.filters.map(u=>(0,M.buildQueryFilterCondition)(u,r.dbType)).join(" AND "),n=`UPDATE ${t.table} SET ${o} WHERE ${a}`;return(await Q(k(r,!0),r.dbType,e)).executeQuery(n,{type:"UPDATE",allowBulkUpdate:!1})},Et=async(e,t)=>{let r=await T.findOne({where:{id:t.datasourceId},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowInsert"]});if(!r)throw new s(404,"Data source not found");if(!r.allowInsert)throw new s(403,"This datasource does not allow insert operations");let{keys:o,values:a}=Cr(t.values),n=`INSERT INTO ${t.table} (${o}) VALUES (${a})`;return(await Q(k(r,!0),r.dbType,e)).executeQuery(n,{type:"INSERT",allowBulkUpdate:!1})},Cr=e=>{let t=e.map(({column:o})=>o).join(", "),r=e.map(({value:o})=>typeof o=="string"?o&&o.startsWith("=")?o.substring(1):`'${o}'`:o).join(", ");return{keys:t,values:r}},Ar=(e,t)=>{if(e.fn){if((0,M.isAllowedFunction)(e.fn))return`${(t==="postgres"?Se.PostgreSqlFunctions:Ie.MySqlColumnFunctions)[e.fn](e)} as "${yt(e)}"`;throw new Error("Function not allowed: "+e.fn)}return`${e.value} as "${e.value}"`},Or=(e,t)=>{if(e.fn){if((0,M.isAllowedFunction)(e.fn))return(t==="postgres"?Se.PostgreSqlFunctions:Ie.MySqlColumnFunctions)[e.fn](e);throw new Error("Function not allowed: "+e.fn)}return e.value},Pr=(e,t)=>t==="postgres"?`"${e}"`:t==="mysql"?`\`${e}\``:e;var wt=R(be()),bt=e=>{if(!e.table)throw new s(400,"Table is required")},Dr=["--",";","DROP","drop"],St=e=>{if((0,wt.isString)(e.value)&&e.value.startsWith("=")){let t=e.value;Dr.forEach(r=>{if(t.includes(r))throw new s(400,"Invalid input value for "+e.column)})}},It=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(St)},Rt=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(St)};var Nt=w(e=>{e.route({method:"post",url:"/select",handler:async t=>{let r=b(t,bt);return{data:await gt(t,r)}}}),e.route({method:"post",url:"/insert",preHandler:[A("admin","editor")],handler:async t=>{let r=b(t,It);return{data:await Et(t,r)}}}),e.route({method:"post",url:"/update",preHandler:[A("admin","editor")],handler:async t=>{let r=b(t,Rt);return{data:await ht(t,r)}}})});var _t=w(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:m.str("SERVER_VERSION")}}))});var Ct=w(e=>{e.route({method:"get",url:"/",handler:async(t,r)=>{let o=t.user.id;return{data:await q.find({where:{users:{user:{id:o}}}})}}}),e.route({method:"post",url:"/",preHandler:[A("admin","editor")],handler:async t=>S.transaction(async()=>{let r=t.user.id,o=b(t),a=N.create();a.id=r;let n=q.create(o);await q.save(n);let i=D.create({user:a,team:n});return await D.save(i),{data:n}})})});var At=w(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=await N.findOne({where:{id:t.user.id},relations:{currentTeam:{team:!0}}});if(!r)throw new s(404,"User not found");return{data:{id:r.id,teamId:r.currentTeam?.team.id,teamName:r.currentTeam?.team.name,teamRole:r.currentTeam?.role}}}}),e.route({method:"patch",url:"/",handler:async t=>{let r=t.user.id,o=b(t);if(!(await N.update(r,o)).affected)throw new s(404,"User not found");let n=await N.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}}}}),e.route({method:"put",url:"/team",handler:async t=>{let r=t.user.id,o=b(t),a=await D.findOneBy({user:{id:r},team:{id:o.teamId}});if(!a)throw new s(404,"User - Team association not found");await N.update(r,{currentTeam:a});let n=await N.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}}}})});var Ot=w(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},model:"gpt-4o"}))),{data:o}}}),e.route({method:"patch",url:"/",handler:async t=>{let{settings:r}=b(t);if(!r.id)throw new s(400,"Settings id is required!");if(!(await $.update(r.id,r)).affected)throw new s(404,"You do not own these settings!");return{data:await $.findOneBy({id:r.id})}}})});var xt=require("node:path");var Ur=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),Pt=async e=>{if(Ur(e))return;let t=e.headers.authorization;if(!t)throw new s(401,"Missing auth token");let[r,o]=t.split(" ");try{let{userId:a}=await je(o),n=await D.findOneBy({user:{id:a}});if(!n)throw new s(401,"User is not part of a team");e.user={id:a,currentTeamRole:n.role}}catch{throw new s(401,"Unauthorized")}};var Dt=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Lt=R(require("@fastify/cookie")),O=(0,Ut.default)(),Ft=m.num("PORT",4466),vr=m.bool("HOST")?"0.0.0.0":"127.0.0.1",Mr=m.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),xr=["https://app.dataramen.xyz","https://dataramen.xyz",`http://localhost:${Ft}`,...Mr];function x(e,t){O.register(e,{prefix:t}),console.log("Registered "+t)}(async function(){_e(),await $e(),await O.register(Lt.default,{}),await O.register(vt.default,{origin:(t,r)=>{!t||xr.includes(t)?r(null,!0):r(new Error("Not allowed by CORS"),!1)},methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),await O.register(Mt.default,{root:(0,xt.join)(__dirname,"web")}),O.get("/",(t,r)=>{r.sendFile("index.html")}),O.addHook("onRequest",Pt),O.addHook("onResponse",Dt),x(Ve,"/api/auth"),x(nt,"/api/data-sources"),x(st,"/api/project"),x(ct,"/api/queries"),x(Nt,"/api/runner"),x(_t,"/api/status"),x(Ct,"/api/teams"),x(At,"/api/users"),x(Ot,"/api/user-settings"),O.setNotFoundHandler((t,r)=>{if(t.raw.url?.startsWith("/api/")){r.code(404).send({error:"API route not found"});return}r.sendFile("index.html")}),O.setErrorHandler((t,r,o)=>{if(t instanceof s){console.error(t),o.status(t.status).send({error:t.message});return}else console.error(t),o.status(500).send({error:"Internal Server Error"})}),await O.after(),await Fe(),O.listen({port:Ft,host:vr},(t,r)=>{t&&(console.error(t),process.exit(1)),console.log(`Server listening at ${r}`)})})();
57
+ limit 25;`;return(await t.query(r)).rows.reduce((a,n)=>(a[n.row_key]={table:n.relname,column:n.attname},a),{})},We=async(e,t,r)=>{try{console.log(`[PG CONN] Query: ${e}`);let{rows:o,fields:a,command:n,rowCount:i}=await t.query({text:e,rowMode:"array"});if(n==="UPDATE"||n==="INSERT"||n==="DELETE"){if(i!=null&&i>1&&r.allowBulkUpdate!==!0)throw new Error("[PG CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[i]],query:e}}if(n==="SELECT"){let u=a.map(c=>`'${c.tableID}-${c.columnID}'`),l=await ar(u,t);return{columns:a.map(c=>{let h=l[`${c.tableID}-${c.columnID}`];return{column:h?.column||c.name,alias:c.name,table:h?.table||"",full:h?h.table+"."+h.column:c.name}}),rows:o,query:e}}throw new Error(`[PG CONN] Unsupported command: ${n}`)}catch(o){throw o instanceof s?o:new s(400,o.message)}},nr=async(e,t)=>{await e.query("BEGIN");try{let r=await t();return await e.query("COMMIT"),console.log("[PG CONN] Commit"),r}catch(r){throw await e.query("ROLLBACK"),console.log("[PG CONN] Rollback"),r}},sr=async(e,t)=>{await e.query("BEGIN READ ONLY");try{let r=await t();return console.log("[PG CONN] Read only rollback"),await e.query("ROLLBACK"),r}catch(r){throw console.log("[PG CONN] Rollback"),await e.query("ROLLBACK"),r}},ze=async e=>{let t=await er(e),r=!1,o=!1,a=async n=>(o||await t.query(`SET search_path TO ${e.schema}`),n());return{dbType:"postgres",dataSource:e,inspectSchema:()=>or(e,t),executeQuery:(n,i)=>a(()=>i.type==="SELECT"?sr(t,()=>We(n,t,i)):nr(t,()=>We(n,t,i))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.end()}}};var M=async(e,t,r)=>{try{let o;if(t==="mysql")o=await je(e);else if(t==="postgres")o=await ze(e);else throw new s(500,`Connection manager for ${t} not found`);return r.__connections?r.__connections.push(o):r.__connections=[o],o}catch(o){throw console.error(o),o instanceof s?o:o?.code==="ECONNREFUSED"?new s(500,"Failed to connect to the database"):new s(500,o.message)}};var W=A(require("node:crypto"));var Je="aes-256-gcm",ir=12,Xe=()=>{let e=m.str("SYMM_ENCRYPTION_KEY");if(!e)throw new Error("Missing ENCRYPTION_KEY in environment variables.");let t=Buffer.from(e,"hex");if(t.length!==32)throw new Error("ENCRYPTION_KEY must be a 64-character hex string (256 bits).");return t},ur=e=>{let t=W.default.randomBytes(ir),r=Xe(),o=W.default.createCipheriv(Je,r,t),a=o.update(e,"utf8","hex");a+=o.final("hex");let n=o.getAuthTag();return{encrypted:a,iv:t.toString("hex"),tag:n.toString("hex")}},cr=({encrypted:e,iv:t,tag:r})=>{let o=Xe(),a=W.default.createDecipheriv(Je,o,Buffer.from(t,"hex"));a.setAuthTag(Buffer.from(r,"hex"));let n=a.update(e,"hex","utf8");return n+=a.final("utf8"),n},V={encrypt:ur,decrypt:cr};var v=(e,t=!1)=>{if(t){let r=V.decrypt({encrypted:e.dbPassword,tag:e.dbPasswordTag,iv:e.dbPasswordIv});return{url:e.dbUrl,user:e.dbUser,database:e.dbDatabase,password:r,port:e.dbPort,schema:e.dbSchema}}return{url:e.dbUrl,user:e.dbUser,database:e.dbDatabase,password:e.dbPassword,port:e.dbPort,schema:e.dbSchema}};var C=(...e)=>(t,r,o)=>{if(!e.includes(t.user.currentTeamRole))throw new s(403,"You are not authorized to perform this action");o()};var Ze=E(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=I(t),o=await f.findOne({where:{id:r}});if(!o)throw new s(404,"Data source not found");return{data:o}}}),e.route({method:"get",url:"/",handler:async t=>{let{teamId:r}=F(t);return{data:await f.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",preHandler:[C("admin")],handler:async t=>{let{teamId:r,ownerId:o,...a}=T(t,Ye),n=f.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),i=await M(v(n),n.dbType,t);try{await i.checkConnection()}catch{throw new s(400,"Cannot connect to the database, please check datasource configuration")}let{tag:u,iv:l,encrypted:c}=V.encrypt(n.dbPassword);return n.dbPassword=c,n.dbPasswordIv=l,n.dbPasswordTag=u,{data:await f.save(n)}}}),e.route({method:"put",url:"/:id",preHandler:[C("admin")],handler:async t=>{let{id:r}=I(t),o=T(t),a=await f.findOneBy({id:r});if(!a)throw new s(404,"Data source not found");let n=f.merge(a,o);return await f.save(n),{data:n}}}),e.route({method:"delete",url:"/:id",preHandler:[C("admin")],handler:async(t,r)=>R.transaction(async()=>{let{id:o}=I(t);await Promise.all([_.delete({datasource:{id:o}}),N.delete({dataSource:{id:o}})]),await f.delete({id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=I(t),a=await f.findOne({where:{id:o},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]});if(!a)throw new Error("Data source not found");a.status="INSPECTING",await f.save(a);let i=await(await M(v(a,!0),a.dbType,t)).inspectSchema();await _.delete({datasource:{id:o}}),await _.insert(i.sort().map(u=>_.create({tableName:u.tableName,columns:u.columns,datasource:{id:o}}))),a.status="READY",a.lastInspected=new Date,await f.save(a)}}),e.route({method:"get",url:"/:id/inspections",handler:async(t,r)=>{let{id:o}=I(t);return{data:await _.find({where:{datasource:{id:o}}})}}})});var ye=require("typeorm"),et=E(e=>{e.route({method:"get",url:"/team/:teamId/files",handler:async(t,r)=>{let{teamId:o}=I(t),a={where:{team:{id:o}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0}},[n=[],i=[]]=await Promise.all([f.find(a),N.find({...a,where:{...a.where,isTrash:!1}})]);return{data:[...n.map(u=>({...u,type:"dataSource"})),...i.map(u=>({...u,type:"query"}))]}}}),e.route({method:"get",url:"/team/:teamId/query",handler:async t=>{let{teamId:r}=I(t),{search:o,size:a}=F(t),n=(parseInt(a)||20)/2,[i,u]=await Promise.all([_.find({where:{tableName:(0,ye.Like)(`%${o}%`),datasource:{team:{id:r}}},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:n}),N.find({where:{name:(0,ye.Like)(`%${o}%`),isTrash:!1,dataSource:{team:{id:r}}},relations:{dataSource:!0},select:{id:!0,name:!0,dataSource:{name:!0,id:!0}},order:{name:"ASC"},take:n})]),l=[];return i.forEach(c=>{l.push({name:c.tableName,id:c.id,dataSourceName:c.datasource?.name||"--",dataSourceId:c.datasource?.id||"--",type:"table"})}),u.forEach(c=>{l.push({name:c.name,id:c.id,dataSourceName:c.dataSource?.name||"--",dataSourceId:c.dataSource?.id||"--",type:"query"})}),{data:l}}})});function tt(e,t=void 0){try{if(e){let r=e.split("&"),o={};for(let a of r){let n=a.split(":");o[n[0]]=n[1]}return o}}catch{}return t}var rt=require("typeorm");var ot=E(e=>{e.route({method:"get",url:"/",handler:async t=>{let{dataSourceId:r,teamId:o,limit:a,orderBy:n,name:i}=F(t);if(!r&&!o)throw new s(400,"Either dsId or teamId is required");let u={isTrash:!1};return r&&(u.dataSource={id:r}),o&&(u.team={id:o}),i&&(u.name=(0,rt.Like)(`%${i}%`)),{data:await N.find({where:u,take:a,order:tt(n,{createdAt:"DESC"})})}}}),e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=I(t),o=await N.findOne({where:{id:r},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return o?{data:o}:{status:404,data:"Query not found"}}}),e.route({method:"post",url:"/",preHandler:[C("admin","editor")],handler:async t=>{let r=T(t),o=await f.findOne({where:{id:r.dataSourceId},relations:{team:!0}}),a=await N.save(N.create({name:r.name,isTrash:!1,opts:r.opts,team:{id:o?.team.id},dataSource:{id:r.dataSourceId}}));return console.log("Created query!"),{data:a}}}),e.route({method:"patch",url:"/:id",preHandler:[C("admin","editor")],handler:async t=>{let{id:r}=I(t),o=T(t);if(!(await N.update(r,o)).affected)throw new s(404,"Query not found");return{data:await N.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",preHandler:[C("admin","editor")],handler:async t=>R.transaction(async()=>{let{id:r}=I(t);if(!(await N.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var J=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`},k={YEAR:e=>`EXTRACT(YEAR FROM ${e.value})`,MONTH:e=>`EXTRACT(MONTH FROM ${e.value})`,DAY:e=>`EXTRACT(DAY FROM ${e.value})`,SUM:e=>`COALESCE(SUM(${e.distinct===!0?"distinct ":""}${e.value}), 0)`,AVG:J,MAX:J,MIN:J,COUNT:J};var X=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`},B={YEAR:e=>`YEAR(${e.value})`,MONTH:e=>`MONTH(${e.value})`,DAY:e=>`DAY(${e.value})`,SUM:e=>{let t=e.distinct===!0?"distinct ":"";return`coalesce(${e.fn}(${t}${e.value}), 0)`},AVG:X,MAX:X,MIN:X,COUNT:X};var at=["SUM","COUNT","AVG","MAX","MIN"],mr=["YEAR","MONTH","DAY",...at],lr=mr.reduce((e,t)=>(e[t]=!0,e),{}),dr=at.reduce((e,t)=>(e[t]=!0,e),{}),Z=e=>lr[e],nt=e=>dr[e],st=(e,t)=>e.fn&&Z(e.fn)?(t==="postgres"?k:B)[e.fn](e):e.value;var ee=e=>typeof e=="string",it=e=>{let t="SELECT ";if(e.columns&&e.columns.length>0?t+=e.columns.join(", "):t+="*",e.table&&(t+=` FROM ${e.table}`),e.joins&&e.joins.length>0&&e.joins.forEach(r=>{t+=` ${r.type} JOIN ${r.table} ON ${r.on}`}),e.where&&(t+=` WHERE ${e.where}`),e.groupBy&&e.groupBy.length>0&&(t+=` GROUP BY ${e.groupBy.join(", ")}`),e.having&&(t+=` HAVING ${e.having}`),e.orderBy&&e.orderBy.length>0){let r=e.orderBy.reduce((a,n)=>(a[n.column]=n.direction,a),{}),o=Object.entries(r).map(([a,n])=>`${a} ${n}`);t+=` ORDER BY ${o.join(", ")}`}return e.limit!==void 0&&(t+=` LIMIT ${e.limit}`),e.offset!==void 0&&(t+=` OFFSET ${e.offset}`),t},$=(e,t)=>{let{column:r,operator:o,value:a,fn:n}=e,i=st({value:r,fn:n},t);switch(o){case"IS NULL":case"IS NOT NULL":return`${i} ${o}`;case"IN":case"NOT IN":let u=a?.map(p=>ee(p.value)?`'${p.value}'`:p.value).join(", ");return`${i} ${o} (${u})`;case"LIKE":return`${i} ${t==="postgres"?"ILIKE":"LIKE"} '%${a?.[0].value}%'`;case"NOT LIKE":return`${i} ${t==="postgres"?"NOT ILIKE":"LIKE"} '%${a?.[0].value}%'`;default:let h=a?.[0],g;return ee(h?.value)&&h?.isColumn!==!0?g=`'${h?.value}'`:g=h?.value,`${i} ${o} ${g}`}};var te=class{constructor(t="mysql"){this.dialect=t,this.skeleton={type:"SELECT"}}addWhere(t){let r=$(t,this.dialect);if(this.skeleton.where){let o=t.connector||"AND";this.skeleton.where+=` ${o} ${r}`}else this.skeleton.where=r;return this}addWhereRaw(t,r="AND"){return this.skeleton.where?this.skeleton.where+=` ${r} ${t}`:this.skeleton.where=t,this}clearWhere(){return this.skeleton.where=void 0,this}addHaving(t){let r=$(t,this.dialect);if(this.skeleton.having){let o=t.connector||"AND";this.skeleton.having+=` ${o} ${r}`}else this.skeleton.having=r;return this}clearHaving(){return this.skeleton.having=void 0,this}addOrderBy(...t){return this.skeleton.orderBy||(this.skeleton.orderBy=[]),this.skeleton.orderBy.push(...t),this}clearOrderBy(){return this.skeleton.orderBy=void 0,this}setLimit(t){return this.skeleton.limit=t,this}setOffset(t){return this.skeleton.offset=t,this}addGroupBy(t){this.skeleton.groupBy||(this.skeleton.groupBy=[]);let r=this.skeleton.groupBy.findIndex(o=>o===t);return r>-1?this.skeleton.groupBy[r]=t:this.skeleton.groupBy.push(t),this}setTable(t){return this.skeleton.table=t,this}addJoin(...t){return this.skeleton.joins||(this.skeleton.joins=[]),this.skeleton.joins.push(...t),this}selectColumns(t){if(this.skeleton.type!=="SELECT")throw new Error("Column selection is only supported for SELECT queries");return this.skeleton.columns=t,this}toSQL(){return it(this.skeleton)}};var lt=require("typeorm");var ut=[{value:"=",label:"equals"},{value:"<>",label:"not equal"},{value:">",label:"greater than"},{value:">=",label:"greater than or equal"},{value:"<",label:"less than"},{value:"<=",label:"less than or equal"},{value:"LIKE",label:"contains"},{value:"NOT LIKE",label:"not contains"},{value:"IN",label:"in list"},{value:"NOT IN",label:"not in list"},{value:"IS NULL",label:"is null"},{value:"IS NOT NULL",label:"is not null"}],pr=ut.reduce((e,t)=>(e[t.value]=t.label,e),{}),Ua=ut.reduce((e,t)=>(e[t.label]=t.value,e),{}),Q=e=>e.map(t=>({label:pr[t],value:t})),xa=Q(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),Ma=Q(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),va=Q(["=","<>","IS NULL","IS NOT NULL"]),La=Q(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),Fa=Q(["IS NULL","IS NOT NULL"]),Qa=Q(["IN","NOT IN"]);var ct=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"];var qa=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var mt=e=>e.fn?e.distinct===!0?`${e.fn} distinct ${e.value}`:`${e.fn} ${e.value}`:e.value;var dt=async(e,{table:t,datasourceId:r,filters:o,joins:a,orderBy:n,size:i,page:u,columns:l,groupBy:c,searchAll:h})=>{let g=await f.findOne({where:{id:r},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]}),p=[t],w=[];if(!g)throw new s(404,"Data source not found");let b=new te(g.dbType);b.setTable(t),b.setLimit(i||20),b.setOffset(i*u),o?.forEach(d=>{d.fn&&nt(d.fn)?b.addHaving(d):b.addWhere(d)}),a&&(b.addJoin(...a),a.forEach(d=>{p.push(d.table)})),n&&b.addOrderBy(...n.map(d=>({...d,column:hr(d.column,g.dbType)}))),c&&c.length>0&&c.forEach(d=>b.addGroupBy(Tr(d,g.dbType)));let xt=await _.find({where:{tableName:(0,lt.In)(p),datasource:{id:r}}});for(let d of xt)if(d.columns)for(let U of d.columns)w.push({column:U.name,table:d.tableName||"",full:`${d.tableName}.${U.name}`,type:U.type});let Y;if(l&&l.length>0?Y=l.map(d=>yr(d,g.dbType)):Y=w.map(d=>`${d.full} as "${d.full}"`),b.selectColumns(Y),h){let d=w.filter(U=>ct.includes(U.type)&&Y.some(oe=>oe.startsWith(U.full)));if(d.length>0){let U=d.map(oe=>`LOWER(${oe.full}) LIKE '%${h.toLowerCase()}%'`);b.addWhereRaw(`(${U.join(" OR ")})`,"AND")}}return{...await(await M(v(g,!0),g.dbType,e)).executeQuery(b.toSQL(),{type:"SELECT",allowBulkUpdate:!1}),tables:p,allColumns:w}},pt=async(e,t)=>{let r=await f.findOne({where:{id:t.datasourceId},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowUpdate"]});if(!r)throw new s(404,"Data source not found");if(!r.allowUpdate)throw new s(403,"This datasource does not allow update operations");let o=t.values.map(({value:u,column:l})=>typeof u=="string"?u&&u.startsWith("=")?`${l}=${u.substring(1)}`:`${l}='${u}'`:`${l}='${u}'`).join(", "),a=t.filters.map(u=>$(u,r.dbType)).join(" AND "),n=`UPDATE ${t.table} SET ${o} WHERE ${a}`;return(await M(v(r,!0),r.dbType,e)).executeQuery(n,{type:"UPDATE",allowBulkUpdate:!1})},ft=async(e,t)=>{let r=await f.findOne({where:{id:t.datasourceId},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser","allowInsert"]});if(!r)throw new s(404,"Data source not found");if(!r.allowInsert)throw new s(403,"This datasource does not allow insert operations");let{keys:o,values:a}=fr(t.values),n=`INSERT INTO ${t.table} (${o}) VALUES (${a})`;return(await M(v(r,!0),r.dbType,e)).executeQuery(n,{type:"INSERT",allowBulkUpdate:!1})},fr=e=>{let t=e.map(({column:o})=>o).join(", "),r=e.map(({value:o})=>typeof o=="string"?o&&o.startsWith("=")?o.substring(1):`'${o}'`:o).join(", ");return{keys:t,values:r}},yr=(e,t)=>{if(e.fn){if(Z(e.fn))return`${(t==="postgres"?k:B)[e.fn](e)} as "${mt(e)}"`;throw new Error("Function not allowed: "+e.fn)}return`${e.value} as "${e.value}"`},Tr=(e,t)=>{if(e.fn){if(Z(e.fn))return(t==="postgres"?k:B)[e.fn](e);throw new Error("Function not allowed: "+e.fn)}return e.value},hr=(e,t)=>t==="postgres"?`"${e}"`:t==="mysql"?`\`${e}\``:e;var yt=e=>{if(!e.table)throw new s(400,"Table is required")},gr=["--",";","DROP","drop"],Tt=e=>{if(ee(e.value)&&e.value.startsWith("=")){let t=e.value;gr.forEach(r=>{if(t.includes(r))throw new s(400,"Invalid input value for "+e.column)})}},ht=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(Tt)},gt=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(Tt)};var wt=E(e=>{e.route({method:"post",url:"/select",handler:async t=>{let r=T(t,yt);return{data:await dt(t,r)}}}),e.route({method:"post",url:"/insert",preHandler:[C("admin","editor")],handler:async t=>{let r=T(t,ht);return{data:await ft(t,r)}}}),e.route({method:"post",url:"/update",preHandler:[C("admin","editor")],handler:async t=>{let r=T(t,gt);return{data:await pt(t,r)}}})});var Et=E(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:m.str("SERVER_VERSION")}}))});var St=E(e=>{e.route({method:"get",url:"/",handler:async(t,r)=>{let o=t.user.id;return{data:await x.find({where:{users:{user:{id:o}}}})}}}),e.route({method:"post",url:"/",preHandler:[C("admin","editor")],handler:async t=>R.transaction(async()=>{let r=t.user.id,o=T(t),a=S.create();a.id=r;let n=x.create(o);await x.save(n);let i=P.create({user:a,team:n});return await P.save(i),{data:n}})})});var Te=A(require("bcryptjs")),re=async e=>{let t=await Te.default.genSalt(10);return Te.default.hash(e,t)};var Rt=E(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=await S.findOne({where:{id:t.user.id},relations:{currentTeam:{team:!0}}});if(!r)throw new s(404,"User not found");return{data:{id:r.id,teamId:r.currentTeam?.team.id,teamName:r.currentTeam?.team.name,teamRole:r.currentTeam?.role,username:r.username}}}}),e.route({method:"patch",url:"/",handler:async t=>{let r=t.user.id,o=T(t);if(o.password&&(o.password=await re(o.password)),!(await S.update(r,o)).affected)throw new s(404,"User not found");let n=await S.findOne({where:{id:r},relations:{currentTeam:{team:!0}}});return{data:{id:n?.id,teamId:n?.currentTeam?.team.id,teamName:n?.currentTeam?.team.name,teamRole:n?.currentTeam?.role,username:n?.username}}}}),e.route({method:"put",url:"/team",handler:async t=>{let r=t.user.id,o=T(t),a=await P.findOneBy({user:{id:r},team:{id:o.teamId}});if(!a)throw new s(404,"User - Team association not found");await S.update(r,{currentTeam:a});let n=await S.findOne({where:{id:r},relations:{currentTeam:{team:!0}}});return{data:{id:n?.id,teamId:n?.currentTeam?.team.id,teamName:n?.currentTeam?.team.name,teamRole:n?.currentTeam?.role,username:n?.username}}}})});var bt=E(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=t.user.id,o=await L.findOneBy({user:{id:r}});return o||(o=await L.save(L.create({user:{id:r}}))),{data:o}}}),e.route({method:"patch",url:"/",handler:async t=>{let{settings:r}=T(t);if(!r.id)throw new s(400,"Settings id is required!");if(!(await L.update(r.id,r)).affected)throw new s(404,"You do not own these settings!");return{data:await L.findOneBy({id:r.id})}}})});var Pt=require("node:path");var wr=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),Nt=async e=>{if(wr(e))return;let t=e.headers.authorization;if(!t)throw new s(401,"Missing auth token");let[r,o]=t.split(" ");try{let{userId:a}=await qe(o),n=await P.findOneBy({user:{id:a}});if(!n)throw new s(401,"User is not part of a team");e.user={id:a,currentTeamRole:n.role}}catch{throw new s(401,"Unauthorized")}};var It=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Dt=A(require("@fastify/cookie"));var H={teamName:"Default Team",username:"admin",password:"admin"},Ct=async()=>{let e=await S.findOne({where:{username:H.username}});if(e)return e;let t=await x.save(x.create({name:H.teamName})),r=await re(H.password),o=await S.save(S.create({username:H.username,password:r})),a=await P.save(P.create({user:o,team:t,role:"admin"}));return await S.update(o.id,{currentTeam:a}),S.findOne({where:{username:H.username}})};var O=(0,At.default)(),Ut=m.num("PORT",4466),Er=m.bool("HOST")?"0.0.0.0":"127.0.0.1",Sr=m.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),Rr=["https://app.dataramen.xyz","https://dataramen.xyz",`http://localhost:${Ut}`,...Sr];function D(e,t){O.register(e,{prefix:t}),console.log("Registered "+t)}(async function(){we(),await Me(),await O.register(Dt.default,{}),await O.register(Ot.default,{origin:(t,r)=>{!t||Rr.includes(t)?r(null,!0):r(new Error("Not allowed by CORS"),!1)},methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),await O.register(_t.default,{root:(0,Pt.join)(__dirname,"web")}),O.get("/",(t,r)=>{r.sendFile("index.html")}),O.addHook("onRequest",Nt),O.addHook("onResponse",It),D(He,"/api/auth"),D(Ze,"/api/data-sources"),D(et,"/api/project"),D(ot,"/api/queries"),D(wt,"/api/runner"),D(Et,"/api/status"),D(St,"/api/teams"),D(Rt,"/api/users"),D(bt,"/api/user-settings"),O.setNotFoundHandler((t,r)=>{if(t.raw.url?.startsWith("/api/")){r.code(404).send({error:"API route not found"});return}r.sendFile("index.html")}),O.setErrorHandler((t,r,o)=>{if(console.error(t),t instanceof s){o.status(t.status).send({error:t.message});return}else o.status(500).send({error:"Internal Server Error"})}),await O.after(),await Pe(),await Ct(),O.listen({port:Ut,host:Er},(t,r)=>{t&&(console.error(t),process.exit(1)),console.log(`Server listening at ${r}`)})})();