@dataramen/cli 0.0.28 → 0.0.30

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,3 +1,5 @@
1
1
  #!/usr/bin/env node
2
- var B=Object.create;var P=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var G=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var Q=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of q(t))!z.call(e,s)&&s!==n&&P(e,s,{get:()=>t[s],enumerable:!(o=U(t,s))||o.enumerable});return e};var f=(e,t,n)=>(n=e!=null?B(G(e)):{},Q(t||!e||!e.__esModule?P(n,"default",{value:e,enumerable:!0}):n,e));var D=f(require("yargs")),J=require("yargs/helpers");var x=require("node:os"),b=require("node:path"),X=(0,x.homedir)();var a="@dataramen/local-server",r=(0,b.join)(X,".dataramen",".runtime","server");var H=require("node:path"),L=f(require("fs-extra")),W=require("node:child_process");var R=f(require("fs-extra")),h=require("node:path");function _(e){let t;function n(){try{return t||(t=R.readJsonSync(e)),t}catch{return}}return n}var A=_((0,h.join)(__dirname,"..","package.json")),v=_((0,h.join)(r,"package.json"));var m=f(require("fs-extra")),c=require("node:path"),k=require("node:child_process"),C=require("node:util"),d=f(require("yocto-spinner")),p=(0,C.promisify)(k.exec);function T(){try{let e=v();if(!e)return!0;let t=m.readJsonSync((0,c.join)(__dirname,"..","dist","package.json"));return e.version!==t.version}catch{return!0}}async function V(){let e=(0,d.default)({text:"Checking if PM2 is installed"}).start();try{return await p("pm2 -v"),e.success("PM2 already installed"),!0}catch{return e.warning("PM2 not installed"),!1}}async function N(){let e=(0,d.default)({text:"Installing PM2"}).start();try{await p("npm i -g pm2"),e.success("Installed PM2")}catch{e.error("Failed to install PM2"),process.exit(1)}}async function y(){let e=(0,d.default)({text:"Stop running instances of "+a}).start();try{await p(`pm2 stop "${a}"`),e.warning("Stopped "+a)}catch{e.success("No running instances of "+a+" found")}}async function j(){let e=(0,d.default)({text:"Create local server"}).start();m.removeSync((0,c.join)(r,"code")),m.copySync((0,c.join)(__dirname,"..","dist","code"),(0,c.join)(r,"code")),m.copySync((0,c.join)(__dirname,"..","dist","env",".env.default"),(0,c.join)(r,"env",".env.default")),m.copySync((0,c.join)(__dirname,"..","dist","package.json"),(0,c.join)(r,"package.json")),e.text="Install local server dependencies",await p("npm i",{cwd:r}),e.success("Local server installed")}var S=f(require("yocto-spinner")),w=f(require("open"));var O=require("node:net");async function I(e){return new Promise(t=>{let n=(0,O.createServer)().once("error",()=>{t(!1)}).once("listening",()=>{n.close()}).once("close",()=>t(!0)).listen(e,"127.0.0.1")})}var M=require("fs-extra");var $=require("node:path");function Y(...e){let t={};for(let n of e){let o=n.split(`
3
- `);for(let s of o){let i=s.trim();if(!i||i.startsWith("#"))continue;let g=i.indexOf("=");if(g===-1)continue;let K=i.slice(0,g).trim(),l=i.slice(g+1).trim();(l.startsWith('"')&&l.endsWith('"')||l.startsWith("'")&&l.endsWith("'"))&&(l=l.slice(1,-1)),t[K]=l}}return{getNumber:n=>te(t[n]),getString:n=>ne(t[n]),getBoolean:n=>re(t[n])}}function Z(e){let t=[];for(let n of e){let o=ee(n);o&&t.push(o)}return Y(...t)}var E=Z([".env.default",".env"]);function ee(e){try{return(0,M.readFileSync)((0,$.join)(r,"env",e),"utf-8")}catch{return}}function te(e){if(!e)return;let t=Number(e);if(!isNaN(t)&&e.trim()!=="")return t;throw new Error("Wrong env value type")}function ne(e){if(e){if(typeof e=="string")return e;throw new Error("Wrong env value type")}}function re(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 oe=async e=>{try{return(await fetch(e,{method:"GET",signal:AbortSignal.timeout(5e3)})).status===200}catch{return!1}},F=async(e,t,n)=>{let o=Date.now();for(;Date.now()-o<t;){if(await oe(e))return!0;await new Promise(i=>setTimeout(i,n))}return!1};async function ae(){await V()||await N(),await y();try{T()&&await j();let t=E.getNumber("PORT");if(!t)throw new Error("PORT env variable not found");if(!await I(t))throw new Error(`Port ${t} is occupied by another process`);let o=(0,S.default)({text:"Starting new instance of "+a}).start(),s=L.readJsonSync((0,H.join)(r,"package.json"));await p(`pm2 start "${s.main}" --name "${a}" --no-autorestart`,{cwd:r}),o.success("Local server will be available in a couple of seconds");let i=(0,S.default)({text:"Waiting for the server to become available"}).start();await F(`http://localhost:${t}/api/status`,3e4,1e3)?(await(0,w.default)(`http://localhost:${t}`),i.success(`App is running at http://localhost:${t}`)):i.error("Server failed to become available in time")}catch(t){console.error("Failed to start local server",t)}}async function ce(){(0,W.execSync)(`pm2 logs ${a}`,{stdio:"inherit"})}async function me(){await y()}function le(){console.log(`DataRamen CLI version: ${A().version}`),console.log(`DataRamen local server version: ${v().version}`)}async function fe(){let e=E.getNumber("PORT");await(0,w.default)(`http://localhost:${e}`)}var u={start:ae,logs:ce,stop:me,version:le,open:fe};(0,D.default)((0,J.hideBin)(process.argv)).command("start","Default command, start/restart the server",u.start).command(["logs"],"Listen for logs",u.logs).command("stop","Stop the server",u.stop).command("open","Stop the server",u.open).command(["version"],"Show version",u.version).parse();
2
+ var q=Object.create;var _=Object.defineProperty;var G=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&&_(e,n,{get:()=>t[n],enumerable:!(i=G(t,n))||i.enumerable});return e};var l=(e,t,r)=>(r=e!=null?q(Q(e)):{},Z(t||!e||!e.__esModule?_(r,"default",{value:e,enumerable:!0}):r,e));var B=l(require("yargs")),U=require("yargs/helpers");var R=require("node:os"),V=require("node:path"),ee=(0,R.homedir)();var a="@dataramen/local-server",s=(0,V.join)(ee,".dataramen",".runtime","server");var D=require("node:path"),J=l(require("fs-extra")),Y=require("node:child_process");var A=l(require("fs-extra")),S=require("node:path");function C(e){let t;function r(){try{return t||(t=A.readJsonSync(e)),t}catch{return}}return r}var k=C((0,S.join)(__dirname,"..","package.json")),y=C((0,S.join)(s,"package.json"));var m=l(require("fs-extra")),c=require("node:path"),T=require("node:child_process"),N=require("node:util"),v=l(require("yocto-spinner")),d=(0,N.promisify)(T.exec);function M(){try{let e=y();if(!e)return!0;let t=m.readJsonSync((0,c.join)(__dirname,"..","dist","package.json"));return e.version!==t.version}catch{return!0}}async function O(){let e=(0,v.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,v.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 w(){let e=(0,v.default)({text:"Stop running instances of "+a}).start();try{await d(`pm2 stop "${a}"`),e.warning("Stopped "+a)}catch{e.success("No running instances of "+a+" found")}}async function I(){let e=(0,v.default)({text:"Create local server"}).start();m.removeSync((0,c.join)(s,"code")),m.copySync((0,c.join)(__dirname,"..","dist","code"),(0,c.join)(s,"code")),m.copySync((0,c.join)(__dirname,"..","dist","env",".env.default"),(0,c.join)(s,"env",".env.default")),m.copySync((0,c.join)(__dirname,"..","dist","package.json"),(0,c.join)(s,"package.json")),e.text="Install local server dependencies",await d("npm i",{cwd:s}),e.success("Local server installed")}var x=l(require("yocto-spinner")),b=l(require("open"));var $=require("node:net");async function H(e){return new Promise(t=>{let r=(0,$.createServer)().once("error",()=>{t(!1)}).once("listening",()=>{r.close()}).once("close",()=>t(!0)).listen(e,"127.0.0.1")})}var K=l(require("node:crypto"));var h=require("fs-extra"),P=require("node:path");function te(e){try{return(0,h.readFileSync)((0,P.join)(s,"env",e),"utf-8")}catch{return}}function F(e){let t={},r=te(e);if(r){let i=r.split(`
3
+ `);for(let n of i){let o=n.trim();if(!o||o.startsWith("#"))continue;let p=o.indexOf("=");if(p===-1)continue;let E=o.slice(0,p).trim(),f=o.slice(p+1).trim();(f.startsWith('"')&&f.endsWith('"')||f.startsWith("'")&&f.endsWith("'"))&&(f=f.slice(1,-1)),t[E]=f}}return t}function ne(){let e={defaultValues:{},customValues:{}};function t(){e.defaultValues=F(".env.default"),e.customValues=F(".env")}function r(){let o=Object.entries(e.customValues).map(([p,E])=>`${p}=${E}`).join(`
4
+ `)+`
5
+ `;(0,h.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 u=ne();function L(){if(!u.getString("SYMM_ENCRYPTION_KEY")){let e=K.randomBytes(32).toString("hex");u.set("SYMM_ENCRYPTION_KEY",e),u.flush()}}var ie=async e=>{try{return(await fetch(e,{method:"GET",signal:AbortSignal.timeout(5e3)})).status===200}catch{return!1}},W=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 O()||await j(),await w();try{M()&&await I(),L();let t=u.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,x.default)({text:"Starting new instance of "+a}).start(),n=J.readJsonSync((0,D.join)(s,"package.json"));await d(`pm2 start "${n.main}" --name "${a}" --no-autorestart`,{cwd:s}),i.success("Local server will be available in a couple of seconds");let o=(0,x.default)({text:"Waiting for the server to become available"}).start();await W(`http://localhost:${t}/api/status`,3e4,1e3)?(await(0,b.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,Y.execSync)(`pm2 logs ${a}`,{stdio:"inherit"})}async function fe(){await w()}function ue(){console.log(`DataRamen CLI version: ${k().version}`),console.log(`DataRamen local server version: ${y().version}`)}async function pe(){let e=u.getNumber("PORT");await(0,b.default)(`http://localhost:${e}`)}var g={start:le,logs:me,stop:fe,version:ue,open:pe};(0,B.default)((0,U.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,3 +1,5 @@
1
1
  #!/usr/bin/env node
2
- var B=Object.create;var P=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var G=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var Q=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of q(t))!z.call(e,s)&&s!==n&&P(e,s,{get:()=>t[s],enumerable:!(o=U(t,s))||o.enumerable});return e};var f=(e,t,n)=>(n=e!=null?B(G(e)):{},Q(t||!e||!e.__esModule?P(n,"default",{value:e,enumerable:!0}):n,e));var D=f(require("yargs")),J=require("yargs/helpers");var x=require("node:os"),b=require("node:path"),X=(0,x.homedir)();var a="@dataramen/local-server",r=(0,b.join)(X,".dataramen",".runtime","server");var H=require("node:path"),L=f(require("fs-extra")),W=require("node:child_process");var R=f(require("fs-extra")),h=require("node:path");function _(e){let t;function n(){try{return t||(t=R.readJsonSync(e)),t}catch{return}}return n}var A=_((0,h.join)(__dirname,"..","package.json")),v=_((0,h.join)(r,"package.json"));var m=f(require("fs-extra")),c=require("node:path"),k=require("node:child_process"),C=require("node:util"),d=f(require("yocto-spinner")),p=(0,C.promisify)(k.exec);function T(){try{let e=v();if(!e)return!0;let t=m.readJsonSync((0,c.join)(__dirname,"..","dist","package.json"));return e.version!==t.version}catch{return!0}}async function V(){let e=(0,d.default)({text:"Checking if PM2 is installed"}).start();try{return await p("pm2 -v"),e.success("PM2 already installed"),!0}catch{return e.warning("PM2 not installed"),!1}}async function N(){let e=(0,d.default)({text:"Installing PM2"}).start();try{await p("npm i -g pm2"),e.success("Installed PM2")}catch{e.error("Failed to install PM2"),process.exit(1)}}async function y(){let e=(0,d.default)({text:"Stop running instances of "+a}).start();try{await p(`pm2 stop "${a}"`),e.warning("Stopped "+a)}catch{e.success("No running instances of "+a+" found")}}async function j(){let e=(0,d.default)({text:"Create local server"}).start();m.removeSync((0,c.join)(r,"code")),m.copySync((0,c.join)(__dirname,"..","dist","code"),(0,c.join)(r,"code")),m.copySync((0,c.join)(__dirname,"..","dist","env",".env.default"),(0,c.join)(r,"env",".env.default")),m.copySync((0,c.join)(__dirname,"..","dist","package.json"),(0,c.join)(r,"package.json")),e.text="Install local server dependencies",await p("npm i",{cwd:r}),e.success("Local server installed")}var S=f(require("yocto-spinner")),w=f(require("open"));var O=require("node:net");async function I(e){return new Promise(t=>{let n=(0,O.createServer)().once("error",()=>{t(!1)}).once("listening",()=>{n.close()}).once("close",()=>t(!0)).listen(e,"127.0.0.1")})}var M=require("fs-extra");var $=require("node:path");function Y(...e){let t={};for(let n of e){let o=n.split(`
3
- `);for(let s of o){let i=s.trim();if(!i||i.startsWith("#"))continue;let g=i.indexOf("=");if(g===-1)continue;let K=i.slice(0,g).trim(),l=i.slice(g+1).trim();(l.startsWith('"')&&l.endsWith('"')||l.startsWith("'")&&l.endsWith("'"))&&(l=l.slice(1,-1)),t[K]=l}}return{getNumber:n=>te(t[n]),getString:n=>ne(t[n]),getBoolean:n=>re(t[n])}}function Z(e){let t=[];for(let n of e){let o=ee(n);o&&t.push(o)}return Y(...t)}var E=Z([".env.default",".env"]);function ee(e){try{return(0,M.readFileSync)((0,$.join)(r,"env",e),"utf-8")}catch{return}}function te(e){if(!e)return;let t=Number(e);if(!isNaN(t)&&e.trim()!=="")return t;throw new Error("Wrong env value type")}function ne(e){if(e){if(typeof e=="string")return e;throw new Error("Wrong env value type")}}function re(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 oe=async e=>{try{return(await fetch(e,{method:"GET",signal:AbortSignal.timeout(5e3)})).status===200}catch{return!1}},F=async(e,t,n)=>{let o=Date.now();for(;Date.now()-o<t;){if(await oe(e))return!0;await new Promise(i=>setTimeout(i,n))}return!1};async function ae(){await V()||await N(),await y();try{T()&&await j();let t=E.getNumber("PORT");if(!t)throw new Error("PORT env variable not found");if(!await I(t))throw new Error(`Port ${t} is occupied by another process`);let o=(0,S.default)({text:"Starting new instance of "+a}).start(),s=L.readJsonSync((0,H.join)(r,"package.json"));await p(`pm2 start "${s.main}" --name "${a}" --no-autorestart`,{cwd:r}),o.success("Local server will be available in a couple of seconds");let i=(0,S.default)({text:"Waiting for the server to become available"}).start();await F(`http://localhost:${t}/api/status`,3e4,1e3)?(await(0,w.default)(`http://localhost:${t}`),i.success(`App is running at http://localhost:${t}`)):i.error("Server failed to become available in time")}catch(t){console.error("Failed to start local server",t)}}async function ce(){(0,W.execSync)(`pm2 logs ${a}`,{stdio:"inherit"})}async function me(){await y()}function le(){console.log(`DataRamen CLI version: ${A().version}`),console.log(`DataRamen local server version: ${v().version}`)}async function fe(){let e=E.getNumber("PORT");await(0,w.default)(`http://localhost:${e}`)}var u={start:ae,logs:ce,stop:me,version:le,open:fe};(0,D.default)((0,J.hideBin)(process.argv)).command("start","Default command, start/restart the server",u.start).command(["logs"],"Listen for logs",u.logs).command("stop","Stop the server",u.stop).command("open","Stop the server",u.open).command(["version"],"Show version",u.version).parse();
2
+ var q=Object.create;var _=Object.defineProperty;var G=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&&_(e,n,{get:()=>t[n],enumerable:!(i=G(t,n))||i.enumerable});return e};var l=(e,t,r)=>(r=e!=null?q(Q(e)):{},Z(t||!e||!e.__esModule?_(r,"default",{value:e,enumerable:!0}):r,e));var B=l(require("yargs")),U=require("yargs/helpers");var R=require("node:os"),V=require("node:path"),ee=(0,R.homedir)();var a="@dataramen/local-server",s=(0,V.join)(ee,".dataramen",".runtime","server");var D=require("node:path"),J=l(require("fs-extra")),Y=require("node:child_process");var A=l(require("fs-extra")),S=require("node:path");function C(e){let t;function r(){try{return t||(t=A.readJsonSync(e)),t}catch{return}}return r}var k=C((0,S.join)(__dirname,"..","package.json")),y=C((0,S.join)(s,"package.json"));var m=l(require("fs-extra")),c=require("node:path"),T=require("node:child_process"),N=require("node:util"),v=l(require("yocto-spinner")),d=(0,N.promisify)(T.exec);function M(){try{let e=y();if(!e)return!0;let t=m.readJsonSync((0,c.join)(__dirname,"..","dist","package.json"));return e.version!==t.version}catch{return!0}}async function O(){let e=(0,v.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,v.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 w(){let e=(0,v.default)({text:"Stop running instances of "+a}).start();try{await d(`pm2 stop "${a}"`),e.warning("Stopped "+a)}catch{e.success("No running instances of "+a+" found")}}async function I(){let e=(0,v.default)({text:"Create local server"}).start();m.removeSync((0,c.join)(s,"code")),m.copySync((0,c.join)(__dirname,"..","dist","code"),(0,c.join)(s,"code")),m.copySync((0,c.join)(__dirname,"..","dist","env",".env.default"),(0,c.join)(s,"env",".env.default")),m.copySync((0,c.join)(__dirname,"..","dist","package.json"),(0,c.join)(s,"package.json")),e.text="Install local server dependencies",await d("npm i",{cwd:s}),e.success("Local server installed")}var x=l(require("yocto-spinner")),b=l(require("open"));var $=require("node:net");async function H(e){return new Promise(t=>{let r=(0,$.createServer)().once("error",()=>{t(!1)}).once("listening",()=>{r.close()}).once("close",()=>t(!0)).listen(e,"127.0.0.1")})}var K=l(require("node:crypto"));var h=require("fs-extra"),P=require("node:path");function te(e){try{return(0,h.readFileSync)((0,P.join)(s,"env",e),"utf-8")}catch{return}}function F(e){let t={},r=te(e);if(r){let i=r.split(`
3
+ `);for(let n of i){let o=n.trim();if(!o||o.startsWith("#"))continue;let p=o.indexOf("=");if(p===-1)continue;let E=o.slice(0,p).trim(),f=o.slice(p+1).trim();(f.startsWith('"')&&f.endsWith('"')||f.startsWith("'")&&f.endsWith("'"))&&(f=f.slice(1,-1)),t[E]=f}}return t}function ne(){let e={defaultValues:{},customValues:{}};function t(){e.defaultValues=F(".env.default"),e.customValues=F(".env")}function r(){let o=Object.entries(e.customValues).map(([p,E])=>`${p}=${E}`).join(`
4
+ `)+`
5
+ `;(0,h.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 u=ne();function L(){if(!u.getString("SYMM_ENCRYPTION_KEY")){let e=K.randomBytes(32).toString("hex");u.set("SYMM_ENCRYPTION_KEY",e),u.flush()}}var ie=async e=>{try{return(await fetch(e,{method:"GET",signal:AbortSignal.timeout(5e3)})).status===200}catch{return!1}},W=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 O()||await j(),await w();try{M()&&await I(),L();let t=u.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,x.default)({text:"Starting new instance of "+a}).start(),n=J.readJsonSync((0,D.join)(s,"package.json"));await d(`pm2 start "${n.main}" --name "${a}" --no-autorestart`,{cwd:s}),i.success("Local server will be available in a couple of seconds");let o=(0,x.default)({text:"Waiting for the server to become available"}).start();await W(`http://localhost:${t}/api/status`,3e4,1e3)?(await(0,b.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,Y.execSync)(`pm2 logs ${a}`,{stdio:"inherit"})}async function fe(){await w()}function ue(){console.log(`DataRamen CLI version: ${k().version}`),console.log(`DataRamen local server version: ${y().version}`)}async function pe(){let e=u.getNumber("PORT");await(0,b.default)(`http://localhost:${e}`)}var g={start:le,logs:me,stop:fe,version:ue,open:pe};(0,B.default)((0,U.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();
@@ -1,9 +1,9 @@
1
- "use strict";var it=Object.create;var ie=Object.defineProperty;var ut=Object.getOwnPropertyDescriptor;var ct=Object.getOwnPropertyNames;var lt=Object.getPrototypeOf,mt=Object.prototype.hasOwnProperty;var q=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var dt=(t,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of ct(e))!mt.call(t,n)&&n!==r&&ie(t,n,{get:()=>e[n],enumerable:!(a=ut(e,n))||a.enumerable});return t};var C=(t,e,r)=>(r=t!=null?it(lt(t)):{},dt(e||!t||!t.__esModule?ie(r,"default",{value:t,enumerable:!0}):r,t));var ke=q(xe=>{"use strict";Object.defineProperty(xe,"__esModule",{value:!0})});var ee=q(N=>{"use strict";Object.defineProperty(N,"__esModule",{value:!0});N.buildWhereCondition=N.buildSelect=N.isString=void 0;var _t=t=>typeof t=="string";N.isString=_t;var At=t=>{let e="SELECT ";if(t.columns&&t.columns.length>0?e+=t.columns.join(", "):e+="*",t.table&&(e+=` FROM ${t.table}`),t.joins&&t.joins.length>0&&t.joins.forEach(r=>{e+=` ${r.type} JOIN ${r.table} ON ${r.on}`}),t.where&&(e+=` WHERE ${t.where}`),t.groupBy&&t.groupBy.length>0&&(e+=` GROUP BY ${t.groupBy.join(", ")}`),t.having&&(e+=` HAVING ${t.having}`),t.orderBy&&t.orderBy.length>0){let r=t.orderBy.reduce((n,o)=>(n[o.column]=o.direction,n),{}),a=Object.entries(r).map(([n,o])=>`${n} ${o}`);e+=` ORDER BY ${a.join(", ")}`}return t.limit!==void 0&&(e+=` LIMIT ${t.limit}`),t.offset!==void 0&&(e+=` OFFSET ${t.offset}`),e};N.buildSelect=At;var Dt=t=>{let{column:e,operator:r,value:a}=t;switch(r){case"IS NULL":case"IS NOT NULL":return`${e} ${r}`;case"IN":case"NOT IN":let n=a?.map(i=>(0,N.isString)(i.value)?`'${i.value}'`:i.value).join(", ");return`${e} ${r} (${n})`;default:let o=a?.[0],s;return(0,N.isString)(o?.value)&&o?.isColumn!==!0?s=`'${o?.value}'`:s=o?.value,`${e} ${r} ${s}`}};N.buildWhereCondition=Dt});var $e=q(Q=>{"use strict";Object.defineProperty(Q,"__esModule",{value:!0});Q.SelectQueryBuilder=void 0;var qe=ee(),te=class{constructor(e="mysql"){this.dialect=e,this.skeleton={type:"SELECT"}}addWhere(e){let r=(0,qe.buildWhereCondition)(e);if(this.skeleton.where){let a=e.connector||"AND";this.skeleton.where+=` ${a} ${r}`}else this.skeleton.where=r;return this}addWhereRaw(e,r="AND"){return this.skeleton.where?this.skeleton.where+=` ${r} ${e}`:this.skeleton.where=e,this}clearWhere(){return this.skeleton.where=void 0,this}addOrderBy(...e){return this.skeleton.orderBy||(this.skeleton.orderBy=[]),this.skeleton.orderBy.push(...e),this}clearOrderBy(){return this.skeleton.orderBy=void 0,this}setLimit(e){return this.skeleton.limit=e,this}setOffset(e){return this.skeleton.offset=e,this}addGroupBy(e){this.skeleton.groupBy||(this.skeleton.groupBy=[]);let r=this.skeleton.groupBy.findIndex(a=>a===e);return r>-1?this.skeleton.groupBy[r]=e:this.skeleton.groupBy.push(e),this}setHaving(e){return this.skeleton.having=e,this}setTable(e){return this.skeleton.table=e,this}addJoin(...e){return this.skeleton.joins||(this.skeleton.joins=[]),this.skeleton.joins.push(...e),this}selectColumns(e){if(this.skeleton.type!=="SELECT")throw new Error("Column selection is only supported for SELECT queries");return this.skeleton.columns=e,this}toSQL(){return(0,qe.buildSelect)(this.skeleton)}};Q.SelectQueryBuilder=te});var Fe=q(O=>{"use strict";var Pt=O&&O.__createBinding||(Object.create?function(t,e,r,a){a===void 0&&(a=r);var n=Object.getOwnPropertyDescriptor(e,r);(!n||("get"in n?!e.__esModule:n.writable||n.configurable))&&(n={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,a,n)}:function(t,e,r,a){a===void 0&&(a=r),t[a]=e[r]}),re=O&&O.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&Pt(e,t,r)};Object.defineProperty(O,"__esModule",{value:!0});re(ke(),O);re($e(),O);re(ee(),O)});var F=require("dotenv"),$=require("node:path"),ue=require("node:fs"),pt=(()=>{try{let t=(0,ue.readFileSync)((0,$.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(t)}catch{return{version:"0.0.0"}}})();(0,F.config)({path:[(0,$.join)(__dirname,"..","env",".env"),(0,$.join)(__dirname,"..","env",".env.default")]});(0,F.populate)(process.env,{SERVER_VERSION:pt.version});var et=C(require("fastify")),tt=C(require("@fastify/cors")),rt=C(require("@fastify/static"));var u=class extends Error{constructor(r,a){super(a);this.status=r;this.message=a}};var Te=require("typeorm");var ce=require("typeorm"),j=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:"datetime",default:"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:"CURRENT_TIMESTAMP"}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var le=require("typeorm"),H=new le.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"}},relations:{users:{type:"many-to-many",target:()=>"User",inverseSide:"teams"},workbooks:{type:"one-to-many",target:()=>"Workbook",inverseSide:"team"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"team"},datasources:{type:"one-to-many",target:()=>"DataSource",inverseSide:"team"}}});var me=require("typeorm"),G=new me.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:"datetime",default:"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:"CURRENT_TIMESTAMP"}},relations:{teams:{type:"many-to-many",target:()=>"Team",inverseSide:"users",joinTable:!0},settings:{type:"one-to-one",target:()=>"UserSettings",inverseSide:"user",joinColumn:!0},currentTeam:{type:"many-to-one",target:()=>"Team",joinColumn:!0}}});var de=require("typeorm"),K=new de.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},openAiToken:{type:String,nullable:!0},model:{type:String,default:"gpt-3.5-turbo"},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var pe=require("typeorm"),z=new pe.EntitySchema({name:"Workbook",tableName:"workbooks",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},path:{type:"uuid",generated:"uuid"},isTrash:{type:"boolean",default:!1},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"workbooks",joinColumn:!0}}});var fe=require("typeorm"),V=new fe.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},dbType:{type:String},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},name:{type:String},description:{type:String,nullable:!0},dbDatabase:{type:String},dbSchema:{type:String,nullable:!0},lastInspected:{type:"datetime",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 ge=C(require("os"));var ye=require("typeorm"),J=new ye.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:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"workbooks",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",inverseSide:"queries",joinColumn:!0}}});function ft(){let t=process.env.TYPEORM_DATABASE;if(!t)throw new Error("Bad value for TYPEORM_DATABASE. Please check your config!");return t.startsWith("<home>")&&(t=t.replace("<home>",ge.default.homedir())),t}var T=new Te.DataSource({type:process.env.TYPEORM_CONNECTION,database:ft(),synchronize:process.env.TYPEORM_SYNCHRONIZE==="true",host:process.env.TYPEORM_HOST,username:process.env.TYPEORM_USERNAME,password:process.env.TYPEORM_PASSWORD,port:process.env.TYPEORM_PORT?parseInt(process.env.TYPEORM_PORT):void 0,logging:process.env.TYPEORM_LOGGING==="true",entities:[j,V,H,G,K,z,J]}),Se=async()=>{if(!T.isInitialized)return T.initialize();throw new Error("Already initialized")},b=T.getRepository(j),d=T.getRepository(V),M=T.getRepository(H),w=T.getRepository(G),U=T.getRepository(K),Ee=T.getRepository(z),h=T.getRepository(J);var X=C(require("node:fs/promises")),he=require("node:path"),Ie=C(require("node:os")),yt=Ie.default.homedir(),Re=(0,he.join)(yt,".dataramen",".runtime","files"),we=async()=>{await Tt()||await X.default.mkdir(Re,{recursive:!0})};async function Tt(){try{return(await X.default.lstat(Re)).isDirectory()}catch{return!1}}var g=t=>(e,r,a)=>{t(e),a()};var y=(t,e)=>{let r=t.body;return e&&e(r),r},v=(t,e)=>{let r=t.query;return e&&e(r),r},S=(t,e)=>{let r=t.params;return e&&e(r),r},D=t=>t.headers["phoenix-user-id"];var be=t=>{if(!t.dbUrl)throw new u(400,"url is required");if(!t.dbUser)throw new u(400,"user is required");if(!t.dbType)throw new u(400,"type is required");if(!t.name)throw new u(400,"name is required");if(!t.dbDatabase)throw new u(400,"database is required")};var Ce=C(require("mysql2/promise"));var gt=({dbDatabase:t,dbPassword:e,dbUser:r,dbUrl:a})=>Ce.default.createConnection({host:a,user:r,database:t,password:e}),St=async t=>{let e=`
1
+ "use strict";var It=Object.create;var be=Object.defineProperty;var Rt=Object.getOwnPropertyDescriptor;var Nt=Object.getOwnPropertyNames;var Ct=Object.getPrototypeOf,Ot=Object.prototype.hasOwnProperty;var M=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var _t=(e,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Nt(t))!Ot.call(e,n)&&n!==r&&be(e,n,{get:()=>t[n],enumerable:!(a=Rt(t,n))||a.enumerable});return e};var I=(e,t,r)=>(r=e!=null?It(Ct(e)):{},_t(t||!e||!e.__esModule?be(r,"default",{value:e,enumerable:!0}):r,e));var Je=M(ze=>{"use strict";Object.defineProperty(ze,"__esModule",{value:!0})});var ie=M(H=>{"use strict";Object.defineProperty(H,"__esModule",{value:!0});H.PostgreSqlFunctions=void 0;var W=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`};H.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:W,MAX:W,MIN:W,COUNT:W}});var ue=M(V=>{"use strict";Object.defineProperty(V,"__esModule",{value:!0});V.MySqlColumnFunctions=void 0;var K=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`};V.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:K,MAX:K,MIN:K,COUNT:K}});var ce=M(m=>{"use strict";Object.defineProperty(m,"__esModule",{value:!0});m.transformColumn=m.isAggregationFunction=m.isAllowedFunction=m.ALLOWED_AGGREGATION_FUNCTIONS=m.ALLOWED_COLUMN_FUNCTIONS=m.COLUMN_FUNCTIONS=m.AGGREGATION_FUNCTIONS=void 0;var Vt=ie(),zt=ue();m.AGGREGATION_FUNCTIONS=["SUM","COUNT","AVG","MAX","MIN"];m.COLUMN_FUNCTIONS=["YEAR","MONTH","DAY",...m.AGGREGATION_FUNCTIONS];m.ALLOWED_COLUMN_FUNCTIONS=m.COLUMN_FUNCTIONS.reduce((e,t)=>(e[t]=!0,e),{});m.ALLOWED_AGGREGATION_FUNCTIONS=m.AGGREGATION_FUNCTIONS.reduce((e,t)=>(e[t]=!0,e),{});var Jt=e=>m.ALLOWED_COLUMN_FUNCTIONS[e];m.isAllowedFunction=Jt;var Xt=e=>m.ALLOWED_AGGREGATION_FUNCTIONS[e];m.isAggregationFunction=Xt;var Zt=(e,t)=>e.fn&&(0,m.isAllowedFunction)(e.fn)?(t==="postgres"?Vt.PostgreSqlFunctions:zt.MySqlColumnFunctions)[e.fn](e):e.value;m.transformColumn=Zt});var le=M(O=>{"use strict";Object.defineProperty(O,"__esModule",{value:!0});O.buildQueryFilterCondition=O.buildSelect=O.isString=void 0;var er=ce(),tr=e=>typeof e=="string";O.isString=tr;var rr=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((n,o)=>(n[o.column]=o.direction,n),{}),a=Object.entries(r).map(([n,o])=>`${n} ${o}`);t+=` ORDER BY ${a.join(", ")}`}return e.limit!==void 0&&(t+=` LIMIT ${e.limit}`),e.offset!==void 0&&(t+=` OFFSET ${e.offset}`),t};O.buildSelect=rr;var ar=(e,t)=>{let{column:r,operator:a,value:n,fn:o}=e,s=(0,er.transformColumn)({value:r,fn:o},t);switch(a){case"IS NULL":case"IS NOT NULL":return`${s} ${a}`;case"IN":case"NOT IN":let c=n?.map(f=>(0,O.isString)(f.value)?`'${f.value}'`:f.value).join(", ");return`${s} ${a} (${c})`;case"LIKE":case"ILIKE":case"NOT LIKE":case"NOT ILIKE":return`${s} ${a} %${n?.[0]}%`;default:let i=n?.[0],l;return(0,O.isString)(i?.value)&&i?.isColumn!==!0?l=`'${i?.value}'`:l=i?.value,`${s} ${a} ${l}`}};O.buildQueryFilterCondition=ar});var Xe=M(z=>{"use strict";Object.defineProperty(z,"__esModule",{value:!0});z.SelectQueryBuilder=void 0;var de=le(),me=class{constructor(t="mysql"){this.dialect=t,this.skeleton={type:"SELECT"}}addWhere(t){let r=(0,de.buildQueryFilterCondition)(t,this.dialect);if(this.skeleton.where){let a=t.connector||"AND";this.skeleton.where+=` ${a} ${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,de.buildQueryFilterCondition)(t,this.dialect);if(this.skeleton.having){let a=t.connector||"AND";this.skeleton.having+=` ${a} ${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(a=>a===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,de.buildSelect)(this.skeleton)}};z.SelectQueryBuilder=me});var pe=M(_=>{"use strict";var nr=_&&_.__createBinding||(Object.create?function(e,t,r,a){a===void 0&&(a=r);var n=Object.getOwnPropertyDescriptor(t,r);(!n||("get"in n?!t.__esModule:n.writable||n.configurable))&&(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,n)}:function(e,t,r,a){a===void 0&&(a=r),e[a]=t[r]}),J=_&&_.__exportStar||function(e,t){for(var r in e)r!=="default"&&!Object.prototype.hasOwnProperty.call(t,r)&&nr(t,e,r)};Object.defineProperty(_,"__esModule",{value:!0});J(Je(),_);J(Xe(),_);J(le(),_);J(ce(),_)});var Y=require("dotenv"),B=require("node:path"),Ee=require("node:fs"),At=(()=>{try{let e=(0,Ee.readFileSync)((0,B.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})();(0,Y.config)({path:[(0,B.join)(__dirname,"..","env",".env"),(0,B.join)(__dirname,"..","env",".env.default")]});(0,Y.populate)(process.env,{SERVER_VERSION:At.version});var Se=()=>{if(!process.env.SYMM_ENCRYPTION_KEY)throw new Error("Missing SYNC_ENCRYPTION_KEY in environment variables.")};var Tt=I(require("fastify")),gt=I(require("@fastify/cors")),bt=I(require("@fastify/static"));var u=class extends Error{constructor(r,a){super(a);this.status=r;this.message=a}};var _e=require("typeorm");var we=require("typeorm"),X=new we.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:"datetime",default:"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:"CURRENT_TIMESTAMP"}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var he=require("typeorm"),Z=new he.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"}},relations:{users:{type:"many-to-many",target:()=>"User",inverseSide:"teams"},workbooks:{type:"one-to-many",target:()=>"Workbook",inverseSide:"team"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"team"},datasources:{type:"one-to-many",target:()=>"DataSource",inverseSide:"team"}}});var Ie=require("typeorm"),ee=new Ie.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:"datetime",default:"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:"CURRENT_TIMESTAMP"}},relations:{teams:{type:"many-to-many",target:()=>"Team",inverseSide:"users",joinTable:!0},settings:{type:"one-to-one",target:()=>"UserSettings",inverseSide:"user",joinColumn:!0},currentTeam:{type:"many-to-one",target:()=>"Team",joinColumn:!0}}});var Re=require("typeorm"),te=new Re.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},openAiToken:{type:String,nullable:!0},model:{type:String,default:"gpt-3.5-turbo"},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var Ne=require("typeorm"),re=new Ne.EntitySchema({name:"Workbook",tableName:"workbooks",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},path:{type:"uuid",generated:"uuid"},isTrash:{type:"boolean",default:!1},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"workbooks",joinColumn:!0}}});var Ce=require("typeorm"),ae=new Ce.EntitySchema({name:"DataSource",tableName:"data_sources",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},dbUrl:{type:String},dbPort:{type:Number,nullable:!0},dbUser:{type:String},dbPassword:{type:String,nullable:!0,select:!1},dbPasswordIv:{type:String,nullable:!0,select:!1},dbPasswordTag:{type:String,nullable:!0,select:!1},dbType:{type:String},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},name:{type:String},description:{type:String,nullable:!0},dbDatabase:{type:String},dbSchema:{type:String,nullable:!0},lastInspected:{type:"datetime",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 Ae=I(require("os"));var Oe=require("typeorm"),ne=new Oe.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:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"workbooks",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",inverseSide:"queries",joinColumn:!0}}});function Dt(){let e=process.env.TYPEORM_DATABASE;if(!e)throw new Error("Bad value for TYPEORM_DATABASE. Please check your config!");return e.startsWith("<home>")&&(e=e.replace("<home>",Ae.default.homedir())),e}var b=new _e.DataSource({type:process.env.TYPEORM_CONNECTION,database:Dt(),synchronize:process.env.TYPEORM_SYNCHRONIZE==="true",host:process.env.TYPEORM_HOST,username:process.env.TYPEORM_USERNAME,password:process.env.TYPEORM_PASSWORD,port:process.env.TYPEORM_PORT?parseInt(process.env.TYPEORM_PORT):void 0,logging:process.env.TYPEORM_LOGGING==="true",entities:[X,ae,Z,ee,te,re,ne]}),De=async()=>{if(!b.isInitialized)return b.initialize();throw new Error("Already initialized")},C=b.getRepository(X),p=b.getRepository(ae),L=b.getRepository(Z),N=b.getRepository(ee),x=b.getRepository(te),Pe=b.getRepository(re),R=b.getRepository(ne);var oe=I(require("node:fs/promises")),ve=require("node:path"),Ue=I(require("node:os")),Pt=Ue.default.homedir(),Me=(0,ve.join)(Pt,".dataramen",".runtime","files"),Le=async()=>{await vt()||await oe.default.mkdir(Me,{recursive:!0})};async function vt(){try{return(await oe.default.lstat(Me)).isDirectory()}catch{return!1}}var E=e=>(t,r,a)=>{e(t),a()};var g=(e,t)=>{let r=e.body;return t&&t(r),r},k=(e,t)=>{let r=e.query;return t&&t(r),r},h=(e,t)=>{let r=e.params;return t&&t(r),r},v=e=>e.headers["phoenix-user-id"];var xe=e=>{if(!e.dbUrl)throw new u(400,"url is required");if(!e.dbUser)throw new u(400,"user is required");if(!e.dbType)throw new u(400,"type is required");if(!e.name)throw new u(400,"name is required");if(!e.dbDatabase)throw new u(400,"database is required")};var Fe=I(require("mysql2/promise"));var Ut=({database:e,password:t,user:r,url:a})=>Fe.default.createConnection({host:a,user:r,database:e,password:t}),Mt=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 t.execute(e),a={};return r.forEach(n=>{let o=n.TABLE_NAME,s=n.COLUMN_NAME;a[o]||(a[o]=[]),a[o].push(s)}),a},Et=async t=>{let e=`
6
+ `,[r]=await e.execute(t),a={};return r.forEach(n=>{let o=n.TABLE_NAME,s=n.COLUMN_NAME;a[o]||(a[o]=[]),a[o].push(s)}),a},Lt=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 t.execute(e),a={};return Array.isArray(r)&&r.forEach(n=>{a[n.table_name]||(a[n.table_name]={}),a[n.table_name][n.field]={refTable:n.referenced_table,refField:n.referenced_field}}),a},ht=async(t,e)=>{let a=(await e.query("SHOW TABLES"))[0],n=await Et(e),o=await St(e),s=a.map(async i=>{let l=Object.values(i)[0],c=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${t.dbDatabase}' and table_name = '${l}'`,[I]=await e.query(c),R=n[l];return{columns:I.map(p=>({name:p.COLUMN_NAME,type:p.DATA_TYPE,isPrimary:o[l]?.includes(p.COLUMN_NAME),ref:R?.[p.COLUMN_NAME]?{table:R[p.COLUMN_NAME].refTable,field:R[p.COLUMN_NAME].refField}:void 0})).sort((p,f)=>p.isPrimary&&f.isPrimary?p.name.localeCompare(f.name):p.isPrimary?-1:1),createdAt:new Date,tableName:l,updatedAt:new Date}});return Promise.all(s)},Ne=async(t,e,r)=>{try{console.log(`[MYSQL CONN] Query: ${t}`);let[a,n]=await e.query({sql:t,rowsAsArray:!0}),o=a?.constructor?.name;if(o==="ResultSetHeader"){let s=a;if(s.affectedRows>3&&r.allowBulkUpdate!==!0)throw new Error("[MYSQL CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[s.affectedRows]],query:t}}else if(o==="Array"){let s=a;return{columns:n?.map(i=>({column:i.orgName||i.name,table:i.orgTable,alias:i.name,full:i.orgTable?i.orgTable+"."+i.orgName:i.name}))||[],rows:s,query:t}}throw new Error(`[MYSQL CONN] Unknown result type: ${o}`)}catch(a){throw console.error(a),a instanceof u?a:new u(400,a.message)}},It=async(t,e)=>{await t.beginTransaction();try{let r=await e();return await t.commit(),console.log("[MYSQL CONN] Commit"),r}catch(r){throw await t.rollback(),console.warn(r.message),console.log("[MYSQL CONN] Rollback"),r}},Oe=async t=>{let e=await gt(t),r=!1;return{dbType:"mysql",dataSource:t,inspectSchema:()=>ht(t,e),executeQuery:(a,n)=>n.type==="SELECT"?Ne(a,e,n):It(e,()=>Ne(a,e,n)),checkConnection:async()=>e.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,e.destroy()}}};var Ae=C(require("pg"));var Rt=async({dbDatabase:t,dbPassword:e,dbUser:r,dbUrl:a,dbPort:n})=>{let o=new Ae.default.Client({host:a,user:r,database:t,password:e,port:n,query_timeout:1e4});return await o.connect(),o},wt=async t=>{let r=await t.query(`
17
+ `,[r]=await e.execute(t),a={};return Array.isArray(r)&&r.forEach(n=>{a[n.table_name]||(a[n.table_name]={}),a[n.table_name][n.field]={refTable:n.referenced_table,refField:n.referenced_field}}),a},xt=async(e,t)=>{let a=(await t.query("SHOW TABLES"))[0],n=await Lt(t),o=await Mt(t),s=a.map(async c=>{let i=Object.values(c)[0],l=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${e.database}' and table_name = '${i}'`,[f]=await t.query(l),S=n[i];return{columns:f.map(y=>({name:y.COLUMN_NAME,type:y.DATA_TYPE,isPrimary:o[i]?.includes(y.COLUMN_NAME),ref:S?.[y.COLUMN_NAME]?{table:S[y.COLUMN_NAME].refTable,field:S[y.COLUMN_NAME].refField}:void 0})).sort((y,T)=>y.isPrimary&&T.isPrimary?y.name.localeCompare(T.name):y.isPrimary?-1:1),createdAt:new Date,tableName:i,updatedAt:new Date}});return Promise.all(s)},qe=async(e,t,r)=>{try{console.log(`[MYSQL CONN] Query: ${e}`);let[a,n]=await t.query({sql:e,rowsAsArray:!0}),o=a?.constructor?.name;if(o==="ResultSetHeader"){let s=a;if(s.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:[[s.affectedRows]],query:e}}else if(o==="Array"){let s=a;return{columns:n?.map(c=>({column:c.orgName||c.name,table:c.orgTable,alias:c.name,full:c.orgTable?c.orgTable+"."+c.orgName:c.name}))||[],rows:s,query:e}}throw new Error(`[MYSQL CONN] Unknown result type: ${o}`)}catch(a){throw console.error(a),a instanceof u?a:new u(400,a.message)}},qt=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}},Ft=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}},ke=async e=>{let t=await Ut(e),r=!1;return{dbType:"mysql",dataSource:e,inspectSchema:()=>xt(e,t),executeQuery:(a,n)=>n.type==="SELECT"?Ft(t,()=>qe(a,t,n)):qt(t,()=>qe(a,t,n)),checkConnection:async()=>t.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.destroy()}}};var $e=I(require("pg"));var kt=async({database:e,password:t,user:r,url:a,port:n})=>{let o=new $e.default.Client({host:a,user:r,database:e,password:t,port:n,query_timeout:1e4});return await o.connect(),o},Qt=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
- `),a={};return r.rows.forEach(n=>{let o=n.table_name,s=n.column_name;a[o]||(a[o]=[]),a[o].push(s)}),a},bt=async t=>{let r=await t.query(`
31
+ `),a={};return r.rows.forEach(n=>{let o=n.table_name,s=n.column_name;a[o]||(a[o]=[]),a[o].push(s)}),a},$t=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,21 +43,21 @@
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
- `),a={};return r.rows.forEach(n=>{a[n.table_name]||(a[n.table_name]={}),a[n.table_name][n.field]={refTable:n.referenced_table,refField:n.referenced_field}}),a},Nt=async(t,e)=>{let r=`SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = '${t.dbSchema}'`,n=(await e.query(r)).rows,o=await bt(e),s=await wt(e),i=n.map(async l=>{let c=Object.values(l)[0],I=`
46
+ `),a={};return r.rows.forEach(n=>{a[n.table_name]||(a[n.table_name]={}),a[n.table_name][n.field]={refTable:n.referenced_table,refField:n.referenced_field}}),a},Bt=async(e,t)=>{let r=`SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = '${e.schema}'`,n=(await t.query(r)).rows,o=await $t(t),s=await Qt(t),c=n.map(async i=>{let l=Object.values(i)[0],f=`
47
47
  SELECT column_name, data_type
48
48
  FROM information_schema.columns
49
49
  WHERE
50
- table_name = '${c}' and
51
- table_schema = '${t.dbSchema}'
52
- `,{rows:R}=await e.query(I),p=o[c];return{columns:R.map(f=>({name:f.column_name,type:f.data_type,isPrimary:s[c]?.includes(f.column_name),ref:p?.[f.column_name]?{table:p[f.column_name].refTable,field:p[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:c,updatedAt:new Date}});return Promise.all(i)},Ct=async(t,e)=>{let r=`select relname, attname, concat(pg_class.oid, '-', attnum) as row_key
50
+ table_name = '${l}' and
51
+ table_schema = '${e.schema}'
52
+ `,{rows:S}=await t.query(f),y=o[l];return{columns:S.map(T=>({name:T.column_name,type:T.data_type,isPrimary:s[l]?.includes(T.column_name),ref:y?.[T.column_name]?{table:y[T.column_name].refTable,field:y[T.column_name].refField}:void 0})).sort((T,w)=>T.isPrimary&&w.isPrimary?T.name.localeCompare(w.name):T.isPrimary?-1:1),createdAt:new Date,tableName:l,updatedAt:new Date}});return Promise.all(c)},Yt=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
- concat(pg_class.oid, '-', attnum) IN (${t.join(", ")})
57
- limit 25;`;return(await e.query(r)).rows.reduce((n,o)=>(n[o.row_key]={table:o.relname,column:o.attname},n),{})},_e=async(t,e,r)=>{try{console.log(`[PG CONN] Query: ${t}`);let{rows:a,fields:n,command:o,rowCount:s}=await e.query({text:t,rowMode:"array"});if(o==="UPDATE"||o==="INSERT"||o==="DELETE"){if(s!=null&&s>3&&r.allowBulkUpdate!==!0)throw new Error("[PG CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[s]],query:t}}if(o==="SELECT"){let i=n.map(c=>`'${c.tableID}-${c.columnID}'`),l=await Ct(i,e);return{columns:n.map(c=>{let I=l[`${c.tableID}-${c.columnID}`];return{column:I?.column||c.name,alias:c.name,table:I?.table||"",full:I?I.table+"."+I.column:c.name}}),rows:a,query:t}}throw new Error(`[PG CONN] Unsupported command: ${o}`)}catch(a){throw a instanceof u?a:new u(400,a.message)}},Ot=async(t,e)=>{await t.query("BEGIN");try{let r=await e();return await t.query("COMMIT"),console.log("[PG CONN] Commit"),r}catch(r){throw await t.query("ROLLBACK"),console.log("[PG CONN] Rollback"),r}},De=async t=>{let e=await Rt(t),r=!1,a=!1,n=async o=>(a||await e.query(`SET search_path TO ${t.dbSchema}`),o());return{dbType:"postgres",dataSource:t,inspectSchema:()=>Nt(t,e),executeQuery:(o,s)=>n(()=>s.type==="SELECT"?_e(o,e,s):Ot(e,()=>_e(o,e,s))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,e.end()}}};var L=async(t,e)=>{try{let r;if(t.dbType==="mysql")r=await Oe(t);else if(t.dbType==="postgres")r=await De(t);else throw new u(500,`Connection manager for ${t.dbType} not found`);return e.__connections?e.__connections.push(r):e.__connections=[r],r}catch(r){throw console.error(r),r instanceof u?r:r?.code==="ECONNREFUSED"?new u(500,"Failed to connect to the database"):new u(500,r.message)}};var Pe=g(t=>{t.get("/:id",async e=>{let{id:r}=S(e),a=await d.findOne({where:{id:r}});if(!a)throw new u(404,"Data source not found");return{data:a}}),t.get("/",async e=>{let{teamId:r}=v(e);return{data:await d.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}),t.post("/",async(e,r)=>{let{teamId:a,ownerId:n,...o}=y(e,be),s=d.create({...o,team:{id:a},owner:{id:n}}),i=await L(s,e);try{await i.checkConnection()}catch{throw new u(400,"Cannot connect to the database, please check datasource configuration")}return{data:await d.save(s)}}),t.put("/:id",async(e,r)=>{let{id:a}=S(e),n=y(e),o=await d.findOneBy({id:a});if(!o)throw new u(404,"Data source not found");let s=d.merge(o,n);return await d.save(s),{data:s}}),t.delete("/:id",async(e,r)=>T.transaction(async()=>{let{id:a}=S(e);await Promise.all([b.delete({datasource:{id:a}}),h.delete({dataSource:{id:a}})]),await d.delete({id:a})})),t.post("/:id/inspect",async(e,r)=>{let{id:a}=S(e),n=await d.findOneBy({id:a});if(!n)throw new Error("Data source not found");n.status="INSPECTING",await d.save(n);let s=await(await L(n,e)).inspectSchema();await b.delete({datasource:{id:a}}),await b.insert(s.sort().map(i=>b.create({tableName:i.tableName,columns:i.columns,datasource:{id:a}}))),n.status="READY",n.lastInspected=new Date,await d.save(n)}),t.get("/:id/inspections",async(e,r)=>{let{id:a}=S(e);return{data:await b.find({where:{datasource:{id:a}}})}})});var Z=require("typeorm"),Me=g(t=>{t.get("/team/:teamId/files",async(e,r)=>{let{teamId:a}=S(e),n={where:{team:{id:a}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0}},[o=[],s=[],i=[]]=await Promise.all([d.find(n),Ee.find({...n,where:{...n.where,isTrash:!1}}),h.find({...n,where:{...n.where,isTrash:!1}})]);return{data:[...o.map(l=>({...l,type:"dataSource"})),...s.map(l=>({...l,type:"workbook"})),...i.map(l=>({...l,type:"query"}))]}}),t.get("/team/:teamId/trash",async e=>{let{teamId:r}=S(e);return{data:await T.query(`
56
+ concat(pg_class.oid, '-', attnum) IN (${e.join(", ")})
57
+ limit 25;`;return(await t.query(r)).rows.reduce((n,o)=>(n[o.row_key]={table:o.relname,column:o.attname},n),{})},Qe=async(e,t,r)=>{try{console.log(`[PG CONN] Query: ${e}`);let{rows:a,fields:n,command:o,rowCount:s}=await t.query({text:e,rowMode:"array"});if(o==="UPDATE"||o==="INSERT"||o==="DELETE"){if(s!=null&&s>1&&r.allowBulkUpdate!==!0)throw new Error("[PG CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[s]],query:e}}if(o==="SELECT"){let c=n.map(l=>`'${l.tableID}-${l.columnID}'`),i=await Yt(c,t);return{columns:n.map(l=>{let f=i[`${l.tableID}-${l.columnID}`];return{column:f?.column||l.name,alias:l.name,table:f?.table||"",full:f?f.table+"."+f.column:l.name}}),rows:a,query:e}}throw new Error(`[PG CONN] Unsupported command: ${o}`)}catch(a){throw a instanceof u?a:new u(400,a.message)}},Gt=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}},jt=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}},Be=async e=>{let t=await kt(e),r=!1,a=!1,n=async o=>(a||await t.query(`SET search_path TO ${e.schema}`),o());return{dbType:"postgres",dataSource:e,inspectSchema:()=>Bt(e,t),executeQuery:(o,s)=>n(()=>s.type==="SELECT"?jt(t,()=>Qe(o,t,s)):Gt(t,()=>Qe(o,t,s))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.end()}}};var q=async(e,t,r)=>{try{let a;if(t==="mysql")a=await ke(e);else if(t==="postgres")a=await Be(e);else throw new u(500,`Connection manager for ${t} not found`);return r.__connections?r.__connections.push(a):r.__connections=[a],a}catch(a){throw console.error(a),a instanceof u?a:a?.code==="ECONNREFUSED"?new u(500,"Failed to connect to the database"):new u(500,a.message)}};var G=I(require("node:crypto")),Ye="aes-256-gcm",Wt=12,Ge=()=>{let e=process.env.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},Ht=e=>{let t=G.default.randomBytes(Wt),r=Ge(),a=G.default.createCipheriv(Ye,r,t),n=a.update(e,"utf8","hex");n+=a.final("hex");let o=a.getAuthTag();return{encrypted:n,iv:t.toString("hex"),tag:o.toString("hex")}},Kt=({encrypted:e,iv:t,tag:r})=>{let a=Ge(),n=G.default.createDecipheriv(Ye,a,Buffer.from(t,"hex"));n.setAuthTag(Buffer.from(r,"hex"));let o=n.update(e,"hex","utf8");return o+=n.final("utf8"),o},j={encrypt:Ht,decrypt:Kt};var F=(e,t=!1)=>{if(t){let r=j.decrypt({encrypted:e.dbPassword,tag:e.dbPasswordTag,iv:e.dbPasswordIv});return{url:e.dbUrl,user:e.dbUser,database:e.dbDatabase,password:r,port:e.dbPort,schema:e.dbSchema}}return{url:e.dbUrl,user:e.dbUser,database:e.dbDatabase,password:e.dbPassword,port:e.dbPort,schema:e.dbSchema}};var je=E(e=>{e.get("/:id",async t=>{let{id:r}=h(t),a=await p.findOne({where:{id:r}});if(!a)throw new u(404,"Data source not found");return{data:a}}),e.get("/",async t=>{let{teamId:r}=k(t);return{data:await p.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}),e.post("/",async(t,r)=>{let{teamId:a,ownerId:n,...o}=g(t,xe),s=p.create({...o,team:{id:a},owner:{id:n}}),c=await q(F(s),s.dbType,t);try{await c.checkConnection()}catch{throw new u(400,"Cannot connect to the database, please check datasource configuration")}let{tag:i,iv:l,encrypted:f}=j.encrypt(s.dbPassword);return s.dbPassword=f,s.dbPasswordIv=l,s.dbPasswordTag=i,{data:await p.save(s)}}),e.put("/:id",async(t,r)=>{let{id:a}=h(t),n=g(t),o=await p.findOneBy({id:a});if(!o)throw new u(404,"Data source not found");let s=p.merge(o,n);return await p.save(s),{data:s}}),e.delete("/:id",async(t,r)=>b.transaction(async()=>{let{id:a}=h(t);await Promise.all([C.delete({datasource:{id:a}}),R.delete({dataSource:{id:a}})]),await p.delete({id:a})})),e.post("/:id/inspect",async(t,r)=>{let{id:a}=h(t),n=await p.findOne({where:{id:a},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]});if(!n)throw new Error("Data source not found");n.status="INSPECTING",await p.save(n);let s=await(await q(F(n,!0),n.dbType,t)).inspectSchema();await C.delete({datasource:{id:a}}),await C.insert(s.sort().map(c=>C.create({tableName:c.tableName,columns:c.columns,datasource:{id:a}}))),n.status="READY",n.lastInspected=new Date,await p.save(n)}),e.get("/:id/inspections",async(t,r)=>{let{id:a}=h(t);return{data:await C.find({where:{datasource:{id:a}}})}})});var se=require("typeorm"),We=E(e=>{e.get("/team/:teamId/files",async(t,r)=>{let{teamId:a}=h(t),n={where:{team:{id:a}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0}},[o=[],s=[],c=[]]=await Promise.all([p.find(n),Pe.find({...n,where:{...n.where,isTrash:!1}}),R.find({...n,where:{...n.where,isTrash:!1}})]);return{data:[...o.map(i=>({...i,type:"dataSource"})),...s.map(i=>({...i,type:"workbook"})),...c.map(i=>({...i,type:"query"}))]}}),e.get("/team/:teamId/trash",async t=>{let{teamId:r}=h(t);return{data:await b.query(`
58
58
  select id, name, updatedAt
59
59
  from workbooks
60
60
  where teamId = '${r}' AND (isTrash = true OR isTrash IS NULL)
61
61
  order by name asc
62
62
  limit 100;
63
- `)}}),t.get("/team/:teamId/query",async e=>{let{teamId:r}=S(e),{search:a,size:n}=v(e),o=(parseInt(n)||20)/2,[s,i]=await Promise.all([b.find({where:{tableName:(0,Z.Like)(`%${a}%`),datasource:{team:{id:r}}},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:o}),h.find({where:{name:(0,Z.Like)(`%${a}%`),isTrash:!1,dataSource:{team:{id:r}}},relations:{dataSource:!0},select:{id:!0,name:!0,dataSource:{name:!0,id:!0}},order:{name:"ASC"},take:o})]),l=[];return s.forEach(c=>{l.push({name:c.tableName,id:c.id,dataSourceName:c.datasource?.name||"--",dataSourceId:c.datasource?.id||"--",type:"table"})}),i.forEach(c=>{l.push({name:c.name,id:c.id,dataSourceName:c.dataSource?.name||"--",dataSourceId:c.dataSource?.id||"--",type:"query"})}),{data:l}})});function Ue(t,e=void 0){try{if(t){let r=t.split("&"),a={};for(let n of r){let o=n.split(":");a[o[0]]=o[1]}return a}}catch{}return e}var Le=require("typeorm"),ve=g(t=>{t.get("/",async e=>{let{dataSourceId:r,teamId:a,limit:n,orderBy:o,name:s}=v(e);if(!r&&!a)throw new u(400,"Either dsId or teamId is required");let i={isTrash:!1};return r&&(i.dataSource={id:r}),a&&(i.team={id:a}),s&&(i.name=(0,Le.Like)(`%${s}%`)),{data:await h.find({where:i,take:n,order:Ue(o,{createdAt:"DESC"})})}}),t.get("/:id",async e=>{let{id:r}=S(e),a=await h.findOne({where:{id:r},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return a?{data:a}:{status:404,data:"Query not found"}}),t.post("/",async e=>{let r=y(e),a=await d.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await h.save(h.create({name:r.name,isTrash:!1,opts:r.opts,team:{id:a?.team.id},dataSource:{id:r.dataSourceId}}))}}),t.patch("/:id",async e=>{let{id:r}=S(e),a=y(e);if(!(await h.update(r,a)).affected)throw new u(404,"Workbook not found");return{data:await h.findOneBy({id:r})}}),t.delete("/:id",async e=>T.transaction(async()=>{let{id:r}=S(e);if(!(await h.delete({id:r})).affected)return{status:404,data:"Workbook not found"}}))});var Y=C(Fe()),Ye=require("typeorm");var Qe=[{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:"ILIKE",label:"case-insensitive contains"},{value:"NOT ILIKE",label:"case-insensitive 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"}],Mt=Qe.reduce((t,e)=>(t[e.value]=e.label,t),{}),zr=Qe.reduce((t,e)=>(t[e.label]=e.value,t),{}),x=t=>t.map(e=>({label:Mt[e],value:e})),Vr=x(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),Jr=x(["=","<>","LIKE","NOT LIKE","ILIKE","NOT ILIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),Xr=x(["=","<>","IS NULL","IS NOT NULL"]),Zr=x(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),ea=x(["IS NULL","IS NOT NULL"]),ta=x(["IN","NOT IN"]);var Be=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"];var ra=["date","datetime","timestamp","timestamptz"].reduce((t,e)=>(t[e]=!0,t),{});var We=t=>t.fn?t.distinct===!0?`${t.fn} distinct ${t.value}`:`${t.fn} ${t.value}`:t.value;var Ut=["YEAR","MONTH","DAY","SUM","AVG","MIN","MAX","COUNT"],Lt=Ut.reduce((t,e)=>(t[e]=!0,t),{}),ae=t=>Lt[t];var B=t=>{let e=t.distinct===!0?"distinct ":"";return`${t.fn}(${e}${t.value})`},ne={YEAR:t=>`EXTRACT(YEAR FROM ${t.value})`,MONTH:t=>`EXTRACT(MONTH FROM ${t.value})`,DAY:t=>`EXTRACT(DAY FROM ${t.value})`,SUM:t=>`COALESCE(SUM(${t.distinct===!0?"distinct ":""}${t.value}), 0)`,AVG:B,MAX:B,MIN:B,COUNT:B};var W=t=>{let e=t.distinct===!0?"distinct ":"";return`${t.fn}(${e}${t.value})`},oe={YEAR:t=>`YEAR(${t.value})`,MONTH:t=>`MONTH(${t.value})`,DAY:t=>`DAY(${t.value})`,SUM:t=>{let e=t.distinct===!0?"distinct ":"";return`coalesce(${t.fn}(${e}${t.value}), 0)`},AVG:W,MAX:W,MIN:W,COUNT:W};var se=async(t,{table:e,datasourceId:r,filters:a,joins:n,orderBy:o,size:s,page:i,columns:l,groupBy:c,searchAll:I})=>{let R=await d.findOneBy({id:r}),p=[e],f=[];if(!R)throw new u(404,"Data source not found");let E=new Y.SelectQueryBuilder(R.dbType);E.setTable(e),E.setLimit(s||20),E.setOffset(s*i),a?.forEach(m=>{E.addWhere(xt(m))}),n&&(E.addJoin(...n),n.forEach(m=>{p.push(m.table)})),o&&E.addOrderBy(...o.map(m=>({...m,column:$t(m.column,R.dbType)}))),c&&c.length>0&&c.forEach(m=>E.addGroupBy(qt(m,R.dbType)));let ot=await b.find({where:{tableName:(0,Ye.In)(p),datasource:{id:r}}});for(let m of ot)if(m.columns)for(let A of m.columns)f.push({column:A.name,table:m.tableName||"",full:`${m.tableName}.${A.name}`,type:A.type});let k;if(l&&l.length>0?k=l.map(m=>kt(m,R.dbType)):k=f.map(m=>`${m.full} as "${m.full}"`),E.selectColumns(k),I){let m=f.filter(A=>Be.includes(A.type)&&k.includes(A.full));if(m.length>0){let A=m.map(st=>`LOWER(${st.full}) LIKE '%${I.toLowerCase()}%'`);E.addWhereRaw(`(${A.join(" OR ")})`,"AND")}}return{...await(await L(R,t)).executeQuery(E.toSQL(),{type:"SELECT",allowBulkUpdate:!1}),tables:p,allColumns:f}},je=async(t,e)=>{let r=await d.findOneBy({id:e.datasourceId});if(!r)throw new u(404,"Data source not found");let a=e.values.map(({value:i,column:l})=>typeof i=="string"?i&&i.startsWith("=")?`${l}=${i.substring(1)}`:`${l}='${i}'`:`${l}='${i}'`).join(", "),n=e.filters.map(Y.buildWhereCondition).join(" AND "),o=`UPDATE ${e.table} SET ${a} WHERE ${n}`;return(await L(r,t)).executeQuery(o,{type:"UPDATE",allowBulkUpdate:!1})},He=async(t,e)=>{let r=await d.findOneBy({id:e.datasourceId});if(!r)throw new u(404,"Data source not found");let{keys:a,values:n}=vt(e.values),o=`INSERT INTO ${e.table} (${a}) VALUES (${n})`;return(await L(r,t)).executeQuery(o,{type:"INSERT",allowBulkUpdate:!1})},vt=t=>{let e=t.map(({column:a})=>a).join(", "),r=t.map(({value:a})=>typeof a=="string"?a&&a.startsWith("=")?a.substring(1):`'${a}'`:a).join(", ");return{keys:e,values:r}},xt=t=>{let e={...t};switch(e.operator){case"IS NULL":case"IS NOT NULL":e.value=void 0;break;case"LIKE":case"ILIKE":case"NOT LIKE":case"NOT ILIKE":e.value=e.value?.map(r=>({isColumn:r?.isColumn,value:`%${r?.value}%`}));break}return e},kt=(t,e)=>{if(t.fn){let r=t.fn.toUpperCase();if(ae(r))return`${(e==="postgres"?ne:oe)[r](t)} as "${We(t)}"`;throw new Error("Function not allowed: "+t.fn)}return`${t.value} as "${t.value}"`},qt=(t,e)=>{if(t.fn){let r=t.fn.toUpperCase();if(ae(r))return(e==="postgres"?ne:oe)[r](t);throw new Error("Function not allowed: "+t.fn)}return t.value},$t=(t,e)=>e==="postgres"?`"${t}"`:e==="mysql"?`\`${t}\``:t;var Ge=g(t=>{t.post("/sql",async e=>{let r=y(e);return{data:await se(e,r)}}),t.post("/select",async e=>{let r=y(e);return{data:await se(e,r)}}),t.post("/insert",async e=>{let r=y(e);return{data:await He(e,r)}}),t.post("/update",async e=>{let r=y(e);return{data:await je(e,r)}})});var Ke=require("node:child_process"),ze=g(t=>{t.get("/",async(e,r)=>({data:{active:!0,version:process.env.SERVER_VERSION}})),t.get("/logs",async()=>{(0,Ke.spawn)(`echo "${process.env.SERVER_VERSION}"`)})});var Ve=g(t=>{t.get("/",async(e,r)=>{let a=D(e);return{data:await M.find({where:{users:{id:a}}})}}),t.post("/",async(e,r)=>T.transaction(async()=>{let a=D(e),n=y(e),o=w.create();o.id=a;let s=M.create(n);return s.users=[o],await M.save(s),{data:s}}))});async function Ft(){let t=M.create({name:"Personal"}),e=await w.save(w.create({}));return t.users=[e],await M.save(t),await w.update(e.id,{currentTeam:{id:t.id}}),w.findOne({where:{},relations:{currentTeam:!0}})}var Je=g(t=>{t.get("/",async(e,r)=>{let a=await w.findOne({where:{},relations:{currentTeam:!0}});return a?{data:a}:{data:await Ft()}}),t.put("/",async(e,r)=>{let a=D(e),n=y(e);if(!(await w.update(a,n)).affected)throw new u(404,"User not found");return{data:w.findOneBy({id:a})}}),t.put("/team",async(e,r)=>{let a=D(e),n=y(e);return await w.update(a,{currentTeam:{id:n.teamId}}),{data:await w.findOne({where:{id:a},relations:{currentTeam:!0}})}})});var Qt="********************************************",Xe=t=>t.slice(0,4)+Qt+t.slice(t.length-4);function Bt(t){let e=U.create(t);return t.openAiToken&&(e.openAiToken=Xe(t.openAiToken)),e}var Ze=g(t=>{t.get("/",async e=>{let r=D(e),a=await U.findOneBy({user:{id:r}});return a||(a=await U.save(U.create({user:{id:r},model:"gpt-4o"}))),{data:Bt(a)}}),t.patch("/",async e=>{let{settings:r}=y(e);if(!r.id)throw new u(400,"Settings id is required!");if(!(await U.update(r.id,r)).affected)throw new u(404,"You do not own these settings!");return{data:await U.findOneBy({id:r.id})}})});var at=require("node:path"),_=(0,et.default)(),nt=process.env.PORT?parseInt(process.env.PORT):4466,Wt=process.env.HOST==="true"?"0.0.0.0":"127.0.0.1",Yt=(process.env.ALLOWED_ORIGINS||"").split(",").map(t=>t.trim()),jt=["https://app.dataramen.xyz","https://dataramen.xyz",`http://localhost:${nt}`,...Yt];function P(t,e){_.register(t,{prefix:e}),console.log("Registered "+e)}(async function(){await we(),P(Pe,"/api/data-sources"),P(Me,"/api/project"),P(ve,"/api/queries"),P(Ge,"/api/runner"),P(ze,"/api/status"),P(Ve,"/api/teams"),P(Je,"/api/users"),P(Ze,"/api/user-settings"),_.register(rt.default,{root:(0,at.join)(__dirname,"web")}),_.get("/",(e,r)=>{r.sendFile("index.html")}),_.register(tt.default,{origin:(e,r)=>{!e||jt.includes(e)?r(null,!0):r(new Error("Not allowed by CORS"),!1)},methods:"*"}),_.addHook("onResponse",async e=>{e.__connections&&e.__connections.forEach(r=>{r.close()})}),_.setNotFoundHandler((e,r)=>{if(e.raw.url?.startsWith("/api/")){r.code(404).send({error:"API route not found"});return}r.sendFile("index.html")}),_.setErrorHandler((e,r,a)=>{if(e instanceof u){console.error(e),a.status(e.status).send({error:e.message});return}else console.error(e),a.status(500).send({error:"Internal Server Error"})}),await _.after(),await Se(),_.listen({port:nt,host:Wt},(e,r)=>{e&&(console.error(e),process.exit(1)),console.log(`Server listening at ${r}`)})})();
63
+ `)}}),e.get("/team/:teamId/query",async t=>{let{teamId:r}=h(t),{search:a,size:n}=k(t),o=(parseInt(n)||20)/2,[s,c]=await Promise.all([C.find({where:{tableName:(0,se.Like)(`%${a}%`),datasource:{team:{id:r}}},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:o}),R.find({where:{name:(0,se.Like)(`%${a}%`),isTrash:!1,dataSource:{team:{id:r}}},relations:{dataSource:!0},select:{id:!0,name:!0,dataSource:{name:!0,id:!0}},order:{name:"ASC"},take:o})]),i=[];return s.forEach(l=>{i.push({name:l.tableName,id:l.id,dataSourceName:l.datasource?.name||"--",dataSourceId:l.datasource?.id||"--",type:"table"})}),c.forEach(l=>{i.push({name:l.name,id:l.id,dataSourceName:l.dataSource?.name||"--",dataSourceId:l.dataSource?.id||"--",type:"query"})}),{data:i}})});function He(e,t=void 0){try{if(e){let r=e.split("&"),a={};for(let n of r){let o=n.split(":");a[o[0]]=o[1]}return a}}catch{}return t}var Ke=require("typeorm"),Ve=E(e=>{e.get("/",async t=>{let{dataSourceId:r,teamId:a,limit:n,orderBy:o,name:s}=k(t);if(!r&&!a)throw new u(400,"Either dsId or teamId is required");let c={isTrash:!1};return r&&(c.dataSource={id:r}),a&&(c.team={id:a}),s&&(c.name=(0,Ke.Like)(`%${s}%`)),{data:await R.find({where:c,take:n,order:He(o,{createdAt:"DESC"})})}}),e.get("/:id",async t=>{let{id:r}=h(t),a=await R.findOne({where:{id:r},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return a?{data:a}:{status:404,data:"Query not found"}}),e.post("/",async t=>{let r=g(t),a=await p.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await R.save(R.create({name:r.name,isTrash:!1,opts:r.opts,team:{id:a?.team.id},dataSource:{id:r.dataSourceId}}))}}),e.patch("/:id",async t=>{let{id:r}=h(t),a=g(t);if(!(await R.update(r,a)).affected)throw new u(404,"Workbook not found");return{data:await R.findOneBy({id:r})}}),e.delete("/:id",async t=>b.transaction(async()=>{let{id:r}=h(t);if(!(await R.delete({id:r})).affected)return{status:404,data:"Workbook not found"}}))});var A=I(pe()),rt=require("typeorm");var Ze=[{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:"ILIKE",label:"case-insensitive contains"},{value:"NOT ILIKE",label:"case-insensitive 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"}],or=Ze.reduce((e,t)=>(e[t.value]=t.label,e),{}),Aa=Ze.reduce((e,t)=>(e[t.label]=t.value,e),{}),Q=e=>e.map(t=>({label:or[t],value:t})),Da=Q(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),Pa=Q(["=","<>","LIKE","NOT LIKE","ILIKE","NOT ILIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),va=Q(["=","<>","IS NULL","IS NOT NULL"]),Ua=Q(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),Ma=Q(["IS NULL","IS NOT NULL"]),La=Q(["IN","NOT IN"]);var et=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"];var xa=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var tt=e=>e.fn?e.distinct===!0?`${e.fn} distinct ${e.value}`:`${e.fn} ${e.value}`:e.value;var ye=I(ie()),fe=I(ue());var Te=async(e,{table:t,datasourceId:r,filters:a,joins:n,orderBy:o,size:s,page:c,columns:i,groupBy:l,searchAll:f})=>{let S=await p.findOne({where:{id:r},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]}),y=[t],T=[];if(!S)throw new u(404,"Data source not found");let w=new A.SelectQueryBuilder(S.dbType);w.setTable(t),w.setLimit(s||20),w.setOffset(s*c),a?.forEach(d=>{d.fn&&(0,A.isAggregationFunction)(d.fn)?w.addHaving(d):w.addWhere(d)}),n&&(w.addJoin(...n),n.forEach(d=>{y.push(d.table)})),o&&w.addOrderBy(...o.map(d=>({...d,column:cr(d.column,S.dbType)}))),l&&l.length>0&&l.forEach(d=>w.addGroupBy(ur(d,S.dbType)));let wt=await C.find({where:{tableName:(0,rt.In)(y),datasource:{id:r}}});for(let d of wt)if(d.columns)for(let P of d.columns)T.push({column:P.name,table:d.tableName||"",full:`${d.tableName}.${P.name}`,type:P.type});let $;if(i&&i.length>0?$=i.map(d=>ir(d,S.dbType)):$=T.map(d=>`${d.full} as "${d.full}"`),w.selectColumns($),f){let d=T.filter(P=>et.includes(P.type)&&$.includes(P.full));if(d.length>0){let P=d.map(ht=>`LOWER(${ht.full}) LIKE '%${f.toLowerCase()}%'`);w.addWhereRaw(`(${P.join(" OR ")})`,"AND")}}return{...await(await q(F(S,!0),S.dbType,e)).executeQuery(w.toSQL(),{type:"SELECT",allowBulkUpdate:!1}),tables:y,allColumns:T}},at=async(e,t)=>{let r=await p.findOne({where:{id:t.datasourceId},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]});if(!r)throw new u(404,"Data source not found");let a=t.values.map(({value:c,column:i})=>typeof c=="string"?c&&c.startsWith("=")?`${i}=${c.substring(1)}`:`${i}='${c}'`:`${i}='${c}'`).join(", "),n=t.filters.map(c=>(0,A.buildQueryFilterCondition)(c,r.dbType)).join(" AND "),o=`UPDATE ${t.table} SET ${a} WHERE ${n}`;return(await q(F(r,!0),r.dbType,e)).executeQuery(o,{type:"UPDATE",allowBulkUpdate:!1})},nt=async(e,t)=>{let r=await p.findOne({where:{id:t.datasourceId},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]});if(!r)throw new u(404,"Data source not found");let{keys:a,values:n}=sr(t.values),o=`INSERT INTO ${t.table} (${a}) VALUES (${n})`;return(await q(F(r,!0),r.dbType,e)).executeQuery(o,{type:"INSERT",allowBulkUpdate:!1})},sr=e=>{let t=e.map(({column:a})=>a).join(", "),r=e.map(({value:a})=>typeof a=="string"?a&&a.startsWith("=")?a.substring(1):`'${a}'`:a).join(", ");return{keys:t,values:r}},ir=(e,t)=>{if(e.fn){if((0,A.isAllowedFunction)(e.fn))return`${(t==="postgres"?ye.PostgreSqlFunctions:fe.MySqlColumnFunctions)[e.fn](e)} as "${tt(e)}"`;throw new Error("Function not allowed: "+e.fn)}return`${e.value} as "${e.value}"`},ur=(e,t)=>{if(e.fn){if((0,A.isAllowedFunction)(e.fn))return(t==="postgres"?ye.PostgreSqlFunctions:fe.MySqlColumnFunctions)[e.fn](e);throw new Error("Function not allowed: "+e.fn)}return e.value},cr=(e,t)=>t==="postgres"?`"${e}"`:t==="mysql"?`\`${e}\``:e;var ot=I(pe()),ge=e=>{if(!e.table)throw new u(400,"Table is required")},lr=["--",";","DROP","drop"],st=e=>{if((0,ot.isString)(e.value)&&e.value.startsWith("=")){let t=e.value;lr.forEach(r=>{if(t.includes(r))throw new u(400,"Invalid input value for "+e.column)})}},it=e=>{if(!e.table)throw new u(400,"Table is required");e.values.forEach(st)},ut=e=>{if(!e.table)throw new u(400,"Table is required");e.values.forEach(st)};var ct=E(e=>{e.post("/sql",async t=>{let r=g(t,ge);return{data:await Te(t,r)}}),e.post("/select",async t=>{let r=g(t,ge);return{data:await Te(t,r)}}),e.post("/insert",async t=>{let r=g(t,it);return{data:await nt(t,r)}}),e.post("/update",async t=>{let r=g(t,ut);return{data:await at(t,r)}})});var lt=require("node:child_process"),dt=E(e=>{e.get("/",async(t,r)=>({data:{active:!0,version:process.env.SERVER_VERSION}})),e.get("/logs",async()=>{(0,lt.spawn)(`echo "${process.env.SERVER_VERSION}"`)})});var mt=E(e=>{e.get("/",async(t,r)=>{let a=v(t);return{data:await L.find({where:{users:{id:a}}})}}),e.post("/",async(t,r)=>b.transaction(async()=>{let a=v(t),n=g(t),o=N.create();o.id=a;let s=L.create(n);return s.users=[o],await L.save(s),{data:s}}))});async function dr(){let e=L.create({name:"Personal"}),t=await N.save(N.create({}));return e.users=[t],await L.save(e),await N.update(t.id,{currentTeam:{id:e.id}}),N.findOne({where:{},relations:{currentTeam:!0}})}var pt=E(e=>{e.get("/",async(t,r)=>{let a=await N.findOne({where:{},relations:{currentTeam:!0}});return a?{data:a}:{data:await dr()}}),e.put("/",async(t,r)=>{let a=v(t),n=g(t);if(!(await N.update(a,n)).affected)throw new u(404,"User not found");return{data:N.findOneBy({id:a})}}),e.put("/team",async(t,r)=>{let a=v(t),n=g(t);return await N.update(a,{currentTeam:{id:n.teamId}}),{data:await N.findOne({where:{id:a},relations:{currentTeam:!0}})}})});var mr="********************************************",yt=e=>e.slice(0,4)+mr+e.slice(e.length-4);function pr(e){let t=x.create(e);return e.openAiToken&&(t.openAiToken=yt(e.openAiToken)),t}var ft=E(e=>{e.get("/",async t=>{let r=v(t),a=await x.findOneBy({user:{id:r}});return a||(a=await x.save(x.create({user:{id:r},model:"gpt-4o"}))),{data:pr(a)}}),e.patch("/",async t=>{let{settings:r}=g(t);if(!r.id)throw new u(400,"Settings id is required!");if(!(await x.update(r.id,r)).affected)throw new u(404,"You do not own these settings!");return{data:await x.findOneBy({id:r.id})}})});var Et=require("node:path"),D=(0,Tt.default)(),St=process.env.PORT?parseInt(process.env.PORT):4466,yr=process.env.HOST==="true"?"0.0.0.0":"127.0.0.1",fr=(process.env.ALLOWED_ORIGINS||"").split(",").map(e=>e.trim()),Tr=["https://app.dataramen.xyz","https://dataramen.xyz",`http://localhost:${St}`,...fr];function U(e,t){D.register(e,{prefix:t}),console.log("Registered "+t)}(async function(){Se(),await Le(),U(je,"/api/data-sources"),U(We,"/api/project"),U(Ve,"/api/queries"),U(ct,"/api/runner"),U(dt,"/api/status"),U(mt,"/api/teams"),U(pt,"/api/users"),U(ft,"/api/user-settings"),D.register(bt.default,{root:(0,Et.join)(__dirname,"web")}),D.get("/",(t,r)=>{r.sendFile("index.html")}),D.register(gt.default,{origin:(t,r)=>{!t||Tr.includes(t)?r(null,!0):r(new Error("Not allowed by CORS"),!1)},methods:"*"}),D.addHook("onResponse",async t=>{t.__connections&&t.__connections.forEach(r=>{r.close()})}),D.setNotFoundHandler((t,r)=>{if(t.raw.url?.startsWith("/api/")){r.code(404).send({error:"API route not found"});return}r.sendFile("index.html")}),D.setErrorHandler((t,r,a)=>{if(t instanceof u){console.error(t),a.status(t.status).send({error:t.message});return}else console.error(t),a.status(500).send({error:"Internal Server Error"})}),await D.after(),await De(),D.listen({port:St,host:yr},(t,r)=>{t&&(console.error(t),process.exit(1)),console.log(`Server listening at ${r}`)})})();