@dataramen/cli 0.0.40 → 0.0.41

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)(),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
- `);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(`
2
+ var G=Object.create;var x=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var z=Object.getPrototypeOf,Q=Object.prototype.hasOwnProperty;var X=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of q(t))!Q.call(e,n)&&n!==r&&x(e,n,{get:()=>t[n],enumerable:!(s=U(t,n))||s.enumerable});return e};var m=(e,t,r)=>(r=e!=null?G(z(e)):{},X(t||!e||!e.__esModule?x(r,"default",{value:e,enumerable:!0}):r,e));var L=m(require("yargs")),B=require("yargs/helpers");var T=require("node:os"),V=require("node:path"),Z=(0,T.homedir)(),c="@dataramen/server",i=(0,V.join)(Z,".dataramen",".runtime","server");var K=require("node:path"),Y=m(require("fs-extra")),D=require("node:child_process");var C=m(require("fs-extra")),w=require("node:path");function N(e){let t;function r(){try{return t||(t=C.readJsonSync(e)),t}catch{return}}return r}var A=N((0,w.join)(__dirname,"..","package.json")),v=N((0,w.join)(i,"package.json"));var f=m(require("fs-extra")),u=require("node:path"),k=require("node:child_process"),M=require("node:util"),E=m(require("yocto-spinner")),g=(0,M.promisify)(k.exec);function W(){try{let e=v();if(!e)return!0;let t=f.readJsonSync((0,u.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 g("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 g("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 g(`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,u.join)(i,"code")),f.copySync((0,u.join)(__dirname,"..","dist","code"),(0,u.join)(i,"code")),f.copySync((0,u.join)(__dirname,"..","dist","package.json"),(0,u.join)(i,"package.json")),e.text="Install local server dependencies",await g("npm i",{cwd:i}),e.success("Local server installed")}var P=m(require("yocto-spinner")),_=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 h=m(require("node:crypto"));var S=require("fs-extra"),b=require("node:path");function ee(e){try{return(0,S.readFileSync)((0,b.join)(i,e),"utf-8")}catch{return}}function te(e){let t={},r=ee(e);if(r){let s=r.split(`
3
+ `);for(let n of s){let o=n.trim();if(!o||o.startsWith("#"))continue;let d=o.indexOf("=");if(d===-1)continue;let y=o.slice(0,d).trim(),l=o.slice(d+1).trim();(l.startsWith('"')&&l.endsWith('"')||l.startsWith("'")&&l.endsWith("'"))&&(l=l.slice(1,-1)),t[y]=l}}return t}function ne(){let e={customValues:{},fileName:".env"};function t(){e.customValues=te(e.fileName)}function r(){let o=Object.entries(e.customValues).map(([d,y])=>`${d}=${y}`).join(`
4
4
  `)+`
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();
5
+ `;(0,S.writeFileSync)((0,b.join)(i,e.fileName),o,{encoding:"utf8"})}function s(n){if(e.customValues[n])return e.customValues[n]}return t(),{getNumber:n=>re(s(n)),getString:n=>oe(s(n)),getBoolean:n=>se(s(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"||t==="1")return!0;if(t==="false"||t==="0")return!1;throw new Error("Wrong env value type")}var a=ne();function $(){let e=!1;if(!a.getString("SYMM_ENCRYPTION_KEY")){let t=h.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=h.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=h.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}},F=async(e,t,r)=>{let s=Date.now();for(;Date.now()-s<t;){if(await ie(e))return!0;await new Promise(o=>setTimeout(o,r))}return!1};async function me(){await j()||await I(),await R();try{W()&&await J(),$();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 s=(0,P.default)({text:"Starting new instance of "+c}).start(),n=Y.readJsonSync((0,K.join)(i,"package.json"));await g(`pm2 start "${n.main}" --name "${c}" --no-autorestart`,{cwd:i}),s.success("Local server will be available in a couple of seconds");let o=(0,P.default)({text:"Waiting for the server to become available"}).start();await F(`http://localhost:${t}/api/status`,3e4,1e3)?(await(0,_.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 le(){(0,D.execSync)(`pm2 logs ${c}`,{stdio:"inherit"})}async function ue(){await R()}function fe(){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,_.default)(`http://localhost:${e}`)}function de(e){a.set(e.prop,e.value),a.flush()}var p={start:me,logs:le,stop:ue,version:fe,open:pe,setEnvVariable:de};(0,L.default)((0,B.hideBin)(process.argv)).command({command:"start",describe:"Default command, start/restart the server",handler:p.start}).command({command:"logs",describe:"Listen for logs",handler:p.logs}).command({command:"stop",describe:"Stop the server",handler:p.stop}).command({command:"open",describe:"Stop the server",handler:p.open}).command({command:"env set [prop] [value]",describe:"Set env value",handler:p.setEnvVariable}).command({command:"version",describe:"Show version",handler:p.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)(),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
- `);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(`
2
+ var G=Object.create;var x=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var z=Object.getPrototypeOf,Q=Object.prototype.hasOwnProperty;var X=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of q(t))!Q.call(e,n)&&n!==r&&x(e,n,{get:()=>t[n],enumerable:!(s=U(t,n))||s.enumerable});return e};var m=(e,t,r)=>(r=e!=null?G(z(e)):{},X(t||!e||!e.__esModule?x(r,"default",{value:e,enumerable:!0}):r,e));var L=m(require("yargs")),B=require("yargs/helpers");var T=require("node:os"),V=require("node:path"),Z=(0,T.homedir)(),c="@dataramen/server",i=(0,V.join)(Z,".dataramen",".runtime","server");var K=require("node:path"),Y=m(require("fs-extra")),D=require("node:child_process");var C=m(require("fs-extra")),w=require("node:path");function N(e){let t;function r(){try{return t||(t=C.readJsonSync(e)),t}catch{return}}return r}var A=N((0,w.join)(__dirname,"..","package.json")),v=N((0,w.join)(i,"package.json"));var f=m(require("fs-extra")),u=require("node:path"),k=require("node:child_process"),M=require("node:util"),E=m(require("yocto-spinner")),g=(0,M.promisify)(k.exec);function W(){try{let e=v();if(!e)return!0;let t=f.readJsonSync((0,u.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 g("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 g("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 g(`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,u.join)(i,"code")),f.copySync((0,u.join)(__dirname,"..","dist","code"),(0,u.join)(i,"code")),f.copySync((0,u.join)(__dirname,"..","dist","package.json"),(0,u.join)(i,"package.json")),e.text="Install local server dependencies",await g("npm i",{cwd:i}),e.success("Local server installed")}var P=m(require("yocto-spinner")),_=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 h=m(require("node:crypto"));var S=require("fs-extra"),b=require("node:path");function ee(e){try{return(0,S.readFileSync)((0,b.join)(i,e),"utf-8")}catch{return}}function te(e){let t={},r=ee(e);if(r){let s=r.split(`
3
+ `);for(let n of s){let o=n.trim();if(!o||o.startsWith("#"))continue;let d=o.indexOf("=");if(d===-1)continue;let y=o.slice(0,d).trim(),l=o.slice(d+1).trim();(l.startsWith('"')&&l.endsWith('"')||l.startsWith("'")&&l.endsWith("'"))&&(l=l.slice(1,-1)),t[y]=l}}return t}function ne(){let e={customValues:{},fileName:".env"};function t(){e.customValues=te(e.fileName)}function r(){let o=Object.entries(e.customValues).map(([d,y])=>`${d}=${y}`).join(`
4
4
  `)+`
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();
5
+ `;(0,S.writeFileSync)((0,b.join)(i,e.fileName),o,{encoding:"utf8"})}function s(n){if(e.customValues[n])return e.customValues[n]}return t(),{getNumber:n=>re(s(n)),getString:n=>oe(s(n)),getBoolean:n=>se(s(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"||t==="1")return!0;if(t==="false"||t==="0")return!1;throw new Error("Wrong env value type")}var a=ne();function $(){let e=!1;if(!a.getString("SYMM_ENCRYPTION_KEY")){let t=h.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=h.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=h.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}},F=async(e,t,r)=>{let s=Date.now();for(;Date.now()-s<t;){if(await ie(e))return!0;await new Promise(o=>setTimeout(o,r))}return!1};async function me(){await j()||await I(),await R();try{W()&&await J(),$();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 s=(0,P.default)({text:"Starting new instance of "+c}).start(),n=Y.readJsonSync((0,K.join)(i,"package.json"));await g(`pm2 start "${n.main}" --name "${c}" --no-autorestart`,{cwd:i}),s.success("Local server will be available in a couple of seconds");let o=(0,P.default)({text:"Waiting for the server to become available"}).start();await F(`http://localhost:${t}/api/status`,3e4,1e3)?(await(0,_.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 le(){(0,D.execSync)(`pm2 logs ${c}`,{stdio:"inherit"})}async function ue(){await R()}function fe(){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,_.default)(`http://localhost:${e}`)}function de(e){a.set(e.prop,e.value),a.flush()}var p={start:me,logs:le,stop:ue,version:fe,open:pe,setEnvVariable:de};(0,L.default)((0,B.hideBin)(process.argv)).command({command:"start",describe:"Default command, start/restart the server",handler:p.start}).command({command:"logs",describe:"Listen for logs",handler:p.logs}).command({command:"stop",describe:"Stop the server",handler:p.stop}).command({command:"open",describe:"Stop the server",handler:p.open}).command({command:"env set [prop] [value]",describe:"Set env value",handler:p.setEnvVariable}).command({command:"version",describe:"Show version",handler:p.version}).parse();
@@ -1,9 +1,9 @@
1
- "use strict";var Bt=Object.create;var Se=Object.defineProperty;var kt=Object.getOwnPropertyDescriptor;var $t=Object.getOwnPropertyNames;var Ht=Object.getPrototypeOf,Yt=Object.prototype.hasOwnProperty;var Wt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of $t(t))!Yt.call(e,a)&&a!==r&&Se(e,a,{get:()=>t[a],enumerable:!(o=kt(t,a))||o.enumerable});return e};var O=(e,t,r)=>(r=e!=null?Bt(Ht(e)):{},Wt(t||!e||!e.__esModule?Se(r,"default",{value:e,enumerable:!0}):r,e));var K=require("dotenv"),j=require("node:path"),be=require("node:fs"),Gt=(()=>{try{let e=(0,be.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"],Ce=()=>{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 Vt(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 zt(e){return process.env[e]==="true"||process.env[e]==="TRUE"}var d={str:Kt,num:Vt,bool:zt};var ls=require("reflect-metadata"),xt=O(require("fastify")),vt=O(require("@fastify/cors")),Mt=O(require("@fastify/static"));var s=class extends Error{constructor(r,o){super(o);this.status=r;this.message=o}};var Ue=require("typeorm");var Ne=require("typeorm");var h=d.str("APP_DB_TYPE")==="sqlite"?"datetime":"timestamp";var ae=new Ne.EntitySchema({name:"DatabaseInspection",tableName:"db_inspection",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},tableName:{nullable:!0,type:String},columns:{type:"json",nullable:!0},createdAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,default:()=>"CURRENT_TIMESTAMP"}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var Ie=require("typeorm");var ne=new Ie.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,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:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,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 Ae=require("typeorm");var ie=new Ae.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,default:()=>"CURRENT_TIMESTAMP"}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var _e=require("typeorm");var ue=new _e.EntitySchema({name:"DataSource",tableName:"data_sources",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},dbUrl:{type:String},dbPort:{type:Number,nullable:!0},dbUser:{type:String},dbPassword:{type:String,nullable:!0,select:!1},dbPasswordIv:{type:String,nullable:!0,select:!1},dbPasswordTag:{type:String,nullable:!0,select:!1},dbType:{type:String},createdAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,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:h,nullable:!0,default:null},status:{type:String,nullable:!0}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"datasources",joinColumn:!0},inspections:{type:"one-to-many",target:()=>"DatabaseInspection",inverseSide:"datasource"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"dataSource"},owner:{type:"many-to-one",target:()=>"User",joinColumn:!0}}});var xe=O(require("node:os")),ve=require("node:path");var Pe=require("typeorm");var ce=new Pe.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:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,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 De=require("typeorm"),le=new De.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 Jt(){let e=d.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 g=new Ue.DataSource({type:d.str("APP_DB_TYPE"),database:Jt(),host:d.str("APP_DB_HOST"),username:d.str("APP_DB_USERNAME"),password:d.str("APP_DB_PASSWORD"),port:d.num("APP_DB_PORT"),schema:d.str("APP_DB_SCHEMA"),logging:d.bool("APP_DB_LOGGING"),migrationsRun:!0,migrations:[ve.posix.join(__dirname,"migrations","*.js")],entities:[ae,ue,ne,se,le,ie,ce]}),Me=async()=>{if(!g.isInitialized)return g.initialize();throw new Error("Already initialized")},P=g.getRepository(ae),f=g.getRepository(ue),x=g.getRepository(ne),R=g.getRepository(se),b=g.getRepository(le),F=g.getRepository(ie),I=g.getRepository(ce);var me=O(require("node:fs/promises")),Le=require("node:path"),qe=O(require("node:os")),Xt=qe.default.homedir(),Fe=(0,Le.join)(Xt,".dataramen",".runtime","files"),Qe=async()=>{await Zt()||await me.default.mkdir(Fe,{recursive:!0})};async function Zt(){try{return(await me.default.lstat(Fe)).isDirectory()}catch{return!1}}var w=e=>(t,r,o)=>{e(t),o()};var k=require("jose");var Be=new TextEncoder,ke=Be.encode(d.str("JWT_SECRET")),$e=Be.encode(d.str("JWT_REFRESH_SECRET")),de=async({userId:e})=>new k.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign(ke),pe=async({userId:e})=>new k.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign($e),He=async(e,t)=>{try{let{payload:r}=await(0,k.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")}},Ye=async e=>He(e,ke),We=async e=>He(e,$e);var y=(e,t)=>{let r=e.body;return t&&t(r),r},v=(e,t)=>{let r=e.query;return t&&t(r),r},S=(e,t)=>{let r=e.params;return t&&t(r),r};var je=O(require("bcryptjs"));var Ge=e=>{if(!e?.username)throw new s(400,"Username is required");if(!e?.password)throw new s(400,"Password is required")};var V="DATARAMEN_refresh_token",fe={httpOnly:!0,secure:d.bool("PROD"),sameSite:d.bool("PROD"),path:"/",maxAge:10*24*60*60},Ke=w(e=>{e.route({method:"post",url:"/login",config:{isPublic:!0},handler:async(t,r)=>{let{username:o,password:a}=y(t,Ge),n=await R.findOne({where:{username:o}});if(!n||!je.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(V,u,fe),{data:{accessToken:i}}}}),e.route({method:"post",url:"/refresh",config:{isPublic:!0},handler:async(t,r)=>{let o=t.cookies[V];if(!o)return r.code(401).send({message:"Missing refresh token"});let{userId:a}=await We(o),[n,i]=await Promise.all([de({userId:a}),pe({userId:a})]);return r.setCookie(V,i,fe),{data:{accessToken:n}}}}),e.route({method:"post",url:"/logout",config:{isPublic:!0},handler:async(t,r)=>(r.clearCookie(V,fe),{data:!0})})});var Ve=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 Je=O(require("mysql2/promise"));var er=({database:e,password:t,user:r,url:o})=>Je.default.createConnection({host:o,user:r,database:e,password:t}),tr=async e=>{let t=`
1
+ "use strict";var kt=Object.create;var Se=Object.defineProperty;var $t=Object.getOwnPropertyDescriptor;var Ht=Object.getOwnPropertyNames;var Yt=Object.getPrototypeOf,Wt=Object.prototype.hasOwnProperty;var Gt=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of Ht(t))!Wt.call(e,a)&&a!==r&&Se(e,a,{get:()=>t[a],enumerable:!(o=$t(t,a))||o.enumerable});return e};var O=(e,t,r)=>(r=e!=null?kt(Yt(e)):{},Gt(t||!e||!e.__esModule?Se(r,"default",{value:e,enumerable:!0}):r,e));var j=require("dotenv"),K=require("node:path"),be=require("node:fs"),jt=(()=>{try{let e=(0,be.readFileSync)((0,K.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})(),Ce=[];process.argv[2]&&Ce.push((0,K.resolve)(process.argv[2]));(0,j.config)({path:Ce});console.log(process.env);(0,j.populate)(process.env,{SERVER_VERSION:jt.version,PORT:"4466",APP_DB_TYPE:"sqlite",APP_DB_DATABASE:"<home>/.dataramen/.runtime/db.sqlite3",PROD:"true"},{override:!1});var Kt=["SYMM_ENCRYPTION_KEY","JWT_SECRET","JWT_REFRESH_SECRET"],Ne=()=>{let e=[];for(let t of Kt)process.env[t]||e.push(t);if(e.length>0)throw new Error("Following env variables are required but not provided: "+e.join(", "))};function Vt(e,t=void 0){return process.env[e]||t}function zt(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 Jt(e){return process.env[e]==="true"||process.env[e]==="TRUE"||process.env[e]==="1"}var d={str:Vt,num:zt,bool:Jt};var ms=require("reflect-metadata"),vt=O(require("fastify")),Mt=O(require("@fastify/cors")),Lt=O(require("@fastify/static"));var s=class extends Error{constructor(r,o){super(o);this.status=r;this.message=o}};var xe=require("typeorm");var Ie=require("typeorm");var h=d.str("APP_DB_TYPE")==="sqlite"?"datetime":"timestamp";var ae=new Ie.EntitySchema({name:"DatabaseInspection",tableName:"db_inspection",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},tableName:{nullable:!0,type:String},columns:{type:"json",nullable:!0},createdAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,default:()=>"CURRENT_TIMESTAMP"}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var Oe=require("typeorm");var ne=new Oe.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,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 Ae=require("typeorm");var se=new Ae.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,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 _e=require("typeorm");var ie=new _e.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,default:()=>"CURRENT_TIMESTAMP"}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var Pe=require("typeorm");var ue=new Pe.EntitySchema({name:"DataSource",tableName:"data_sources",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},dbUrl:{type:String},dbPort:{type:Number,nullable:!0},dbUser:{type:String},dbPassword:{type:String,nullable:!0,select:!1},dbPasswordIv:{type:String,nullable:!0,select:!1},dbPasswordTag:{type:String,nullable:!0,select:!1},dbType:{type:String},createdAt:{type:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,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:h,nullable:!0,default:null},status:{type:String,nullable:!0}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"datasources",joinColumn:!0},inspections:{type:"one-to-many",target:()=>"DatabaseInspection",inverseSide:"datasource"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"dataSource"},owner:{type:"many-to-one",target:()=>"User",joinColumn:!0}}});var ve=O(require("node:os")),Me=require("node:path");var De=require("typeorm");var ce=new De.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:h,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:h,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 Ue=require("typeorm"),le=new Ue.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 Xt(){let e=d.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>",ve.default.homedir())),e}var g=new xe.DataSource({type:d.str("APP_DB_TYPE"),database:Xt(),host:d.str("APP_DB_HOST"),username:d.str("APP_DB_USERNAME"),password:d.str("APP_DB_PASSWORD"),port:d.num("APP_DB_PORT"),schema:d.str("APP_DB_SCHEMA"),logging:d.bool("APP_DB_LOGGING"),migrationsRun:!0,migrations:[Me.posix.join(__dirname,"migrations","*.js")],entities:[ae,ue,ne,se,le,ie,ce]}),Le=async()=>{if(!g.isInitialized)return g.initialize();throw new Error("Already initialized")},P=g.getRepository(ae),f=g.getRepository(ue),x=g.getRepository(ne),R=g.getRepository(se),b=g.getRepository(le),F=g.getRepository(ie),I=g.getRepository(ce);var me=O(require("node:fs/promises")),qe=require("node:path"),Fe=O(require("node:os")),Zt=Fe.default.homedir(),Be=(0,qe.join)(Zt,".dataramen",".runtime","files"),Qe=async()=>{await er()||await me.default.mkdir(Be,{recursive:!0})};async function er(){try{return(await me.default.lstat(Be)).isDirectory()}catch{return!1}}var w=e=>(t,r,o)=>{e(t),o()};var k=require("jose");var ke=new TextEncoder,$e=ke.encode(d.str("JWT_SECRET")),He=ke.encode(d.str("JWT_REFRESH_SECRET")),de=async({userId:e})=>new k.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign($e),pe=async({userId:e})=>new k.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign(He),Ye=async(e,t)=>{try{let{payload:r}=await(0,k.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")}},We=async e=>Ye(e,$e),Ge=async e=>Ye(e,He);var y=(e,t)=>{let r=e.body;return t&&t(r),r},v=(e,t)=>{let r=e.query;return t&&t(r),r},S=(e,t)=>{let r=e.params;return t&&t(r),r};var Ke=O(require("bcryptjs"));var je=e=>{if(!e?.username)throw new s(400,"Username is required");if(!e?.password)throw new s(400,"Password is required")};var V="DATARAMEN_refresh_token",fe={httpOnly:!0,secure:d.bool("PROD"),sameSite:d.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{username:o,password:a}=y(t,je),n=await R.findOne({where:{username:o}});if(!n||!Ke.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(V,u,fe),{data:{accessToken:i}}}}),e.route({method:"post",url:"/refresh",config:{isPublic:!0},handler:async(t,r)=>{let o=t.cookies[V];if(!o)return r.code(401).send({message:"Missing refresh token"});let{userId:a}=await Ge(o),[n,i]=await Promise.all([de({userId:a}),pe({userId:a})]);return r.setCookie(V,i,fe),{data:{accessToken:n}}}}),e.route({method:"post",url:"/logout",config:{isPublic:!0},handler:async(t,r)=>(r.clearCookie(V,fe),{data:!0})})});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=O(require("mysql2/promise"));var tr=({database:e,password:t,user:r,url:o})=>Xe.default.createConnection({host:o,user:r,database:e,password:t}),rr=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},or=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 p=Object.values(u)[0],c=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${e.database}' and table_name = '${p}'`,[T]=await t.query(c),N=a[p];return{columns:T.map(l=>({name:l.COLUMN_NAME,type:l.DATA_TYPE,isPrimary:n[p]?.includes(l.COLUMN_NAME),ref:N?.[l.COLUMN_NAME]?{table:N[l.COLUMN_NAME].refTable,field:N[l.COLUMN_NAME].refField}:void 0})).sort((l,E)=>l.isPrimary&&E.isPrimary?l.name.localeCompare(E.name):l.isPrimary?-1:1),createdAt:new Date,tableName:p,updatedAt:new Date}});return Promise.all(i)},ze=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}},Xe=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,()=>ze(o,t,a)):ar(t,()=>ze(o,t,a)),checkConnection:async()=>t.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.destroy()}}};var et=O(require("pg"));var sr=async({database:e,password:t,user:r,url:o,port:a})=>{let n=new et.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},ar=async(e,t)=>{let o=(await t.query("SHOW TABLES"))[0],a=await or(t),n=await rr(t),i=o.map(async u=>{let p=Object.values(u)[0],c=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${e.database}' and table_name = '${p}'`,[T]=await t.query(c),N=a[p];return{columns:T.map(l=>({name:l.COLUMN_NAME,type:l.DATA_TYPE,isPrimary:n[p]?.includes(l.COLUMN_NAME),ref:N?.[l.COLUMN_NAME]?{table:N[l.COLUMN_NAME].refTable,field:N[l.COLUMN_NAME].refField}:void 0})).sort((l,E)=>l.isPrimary&&E.isPrimary?l.name.localeCompare(E.name):l.isPrimary?-1:1),createdAt:new Date,tableName:p,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)}},nr=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}},sr=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 tr(e),r=!1;return{dbType:"mysql",dataSource:e,inspectSchema:()=>ar(e,t),executeQuery:(o,a)=>a.type==="SELECT"?sr(t,()=>Je(o,t,a)):nr(t,()=>Je(o,t,a)),checkConnection:async()=>t.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.destroy()}}};var tt=O(require("pg"));var ir=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},ur=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},cr=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 p=>{let c=Object.values(p)[0],T=`
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},lr=async(e,t)=>{let r=`SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = '${e.schema}'`,a=(await t.query(r)).rows,n=await cr(t),i=await ur(t),u=a.map(async p=>{let c=Object.values(p)[0],T=`
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:N}=await t.query(T),l=n[c];return{columns:N.map(E=>({name:E.column_name,type:E.data_type,isPrimary:i[c]?.includes(E.column_name),ref:l?.[E.column_name]?{table:l[E.column_name].refTable,field:l[E.column_name].refField}:void 0})).sort((E,M)=>E.isPrimary&&M.isPrimary?E.name.localeCompare(M.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:N}=await t.query(T),l=n[c];return{columns:N.map(E=>({name:E.column_name,type:E.data_type,isPrimary:i[c]?.includes(E.column_name),ref:l?.[E.column_name]?{table:l[E.column_name].refTable,field:l[E.column_name].refField}:void 0})).sort((E,M)=>E.isPrimary&&M.isPrimary?E.name.localeCompare(M.name):E.isPrimary?-1:1),createdAt:new Date,tableName:c,updatedAt:new Date}});return Promise.all(u)},mr=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),{})},Ze=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}'`),p=await lr(u,t);return{columns:a.map(c=>{let T=p[`${c.tableID}-${c.columnID}`];return{column:T?.column||c.name,alias:c.name,table:T?.table||"",full:T?T.table+"."+T.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}},tt=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,()=>Ze(n,t,i)):mr(t,()=>Ze(n,t,i))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.end()}}};var L=async(e,t,r)=>{try{let o;if(t==="mysql")o=await Xe(e);else if(t==="postgres")o=await tt(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 z=O(require("node:crypto"));var rt="aes-256-gcm",pr=12,ot=()=>{let e=d.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=z.default.randomBytes(pr),r=ot(),o=z.default.createCipheriv(rt,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=ot(),a=z.default.createDecipheriv(rt,o,Buffer.from(t,"hex"));a.setAuthTag(Buffer.from(r,"hex"));let n=a.update(e,"hex","utf8");return n+=a.final("utf8"),n},J={encrypt:fr,decrypt:yr};var q=(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 at=[{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"}],Tr=at.reduce((e,t)=>(e[t.value]=t.label,e),{}),Wo=at.reduce((e,t)=>(e[t.label]=t.value,e),{}),Q=e=>e.map(t=>({label:Tr[t],value:t})),Go=Q(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),jo=Q(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),Ko=Q(["=","<>","IS NULL","IS NOT NULL"]),Vo=Q(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),zo=Q(["IS NULL","IS NOT NULL"]),Jo=Q(["IN","NOT IN"]);var nt=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"];var Xo=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var ye=e=>e.fn?e.distinct===!0?`${e.fn} distinct ${e.value}`:`${e.fn} ${e.value}`:e.value;var Te={read_only:10,editor:20,admin:30,owner:40};var C=e=>{let t=Te[e];return r=>Te[r]>=t},st=async e=>{let t=e.routeOptions.config.requireRole;if(t&&!t(e.user.currentTeamRole))throw new s(403,"You are not authorized to perform this action")};var it=w(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=S(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}=v(t);return{data:await f.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",config:{requireRole:C("admin")},handler:async t=>{let{teamId:r,ownerId:o,...a}=y(t,Ve),n=f.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),i=await L(q(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:p,encrypted:c}=J.encrypt(n.dbPassword);return n.dbPassword=c,n.dbPasswordIv=p,n.dbPasswordTag=u,{data:await f.save(n)}}}),e.route({method:"put",url:"/:id",config:{requireRole:C("admin")},handler:async t=>{let{id:r}=S(t),o=y(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",config:{requireRole:C("admin")},handler:async(t,r)=>g.transaction(async()=>{let{id:o}=S(t);await Promise.all([P.delete({datasource:{id:o}}),I.delete({dataSource:{id:o}})]),await f.delete({id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=S(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 L(q(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 f.save(a)}}),e.route({method:"get",url:"/:id/inspections",handler:async t=>{let{id:r}=S(t);return{data:await P.find({where:{datasource:{id:r}}})}}})});var he=require("typeorm"),ut=w(e=>{e.route({method:"get",url:"/team/:teamId/files",handler:async(t,r)=>{let{teamId:o}=S(t),a={where:{team:{id:o}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0}},[n=[],i=[]]=await Promise.all([f.find(a),I.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}=S(t),{search:o,size:a}=v(t),n=(parseInt(a)||20)/2,[i,u]=await Promise.all([P.find({where:{tableName:(0,he.Like)(`%${o}%`),datasource:{team:{id:r}}},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:n}),I.find({where:{name:(0,he.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})]),p=[];return i.forEach(c=>{p.push({name:c.tableName,id:c.id,dataSourceName:c.datasource?.name||"--",dataSourceId:c.datasource?.id||"--",type:"table"})}),u.forEach(c=>{p.push({name:c.name,id:c.id,dataSourceName:c.dataSource?.name||"--",dataSourceId:c.dataSource?.id||"--",type:"query"})}),{data:p}}})});function ct(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 lt=require("typeorm");var mt=w(e=>{e.route({method:"get",url:"/",handler:async t=>{let{dataSourceId:r,teamId:o,limit:a,orderBy:n,name:i}=v(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,lt.Like)(`%${i}%`)),{data:await I.find({where:u,take:a,order:ct(n,{createdAt:"DESC"})})}}}),e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=S(t),o=await I.findOne({where:{id:r},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return o?{data:o}:{status:404,data:"Query not found"}}}),e.route({method:"post",url:"/",config:{requireRole:C("editor")},handler:async t=>{let r=y(t),o=await f.findOne({where:{id:r.dataSourceId},relations:{team:!0}}),a=await I.save(I.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",config:{requireRole:C("editor")},handler:async t=>{let{id:r}=S(t),o=y(t);if(!(await I.update(r,o)).affected)throw new s(404,"Query not found");return{data:await I.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",config:{requireRole:C("editor")},handler:async t=>g.transaction(async()=>{let{id:r}=S(t);if(!(await I.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var X=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`},$={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:X,MAX:X,MIN:X,COUNT:X};var Z=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`},H={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 dt=["SUM","COUNT","AVG","MAX","MIN"],hr=["YEAR","MONTH","DAY",...dt],gr=hr.reduce((e,t)=>(e[t]=!0,e),{}),wr=dt.reduce((e,t)=>(e[t]=!0,e),{}),ee=e=>gr[e],pt=e=>wr[e],ft=(e,t)=>e.fn&&ee(e.fn)?(t==="postgres"?$:H)[e.fn](e):e.value;var te=e=>typeof e=="string",yt=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},Y=(e,t)=>{let{column:r,operator:o,value:a,fn:n}=e,i=ft({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(l=>te(l.value)?`'${l.value}'`:l.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":"NOT LIKE"} '%${a?.[0].value}%'`;default:let T=a?.[0],N;return te(T?.value)&&T?.isColumn!==!0?N=`'${T?.value}'`:N=T?.value,`${i} ${o} ${N}`}};var re=class{constructor(t="mysql"){this.dialect=t,this.skeleton={type:"SELECT"}}addWhere(t){let r=Y(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=Y(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 yt(this.skeleton)}};var ht=require("typeorm");var gt=async(e,t)=>{let{table:r,datasourceId:o,filters:a,joins:n,orderBy:i,size:u,page:p,columns:c,groupBy:T,searchAll:N}=t,l=await f.findOne({where:{id:o},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]}),E=[r],M=[];if(!l)throw new s(404,"Data source not found");let _=new re(l.dbType);_.setTable(r),_.setLimit(u||20),_.setOffset(u*p),a?.forEach(m=>{m.fn&&pt(m.fn)?_.addHaving(m):_.addWhere(m)}),n&&(_.addJoin(...n),n.forEach(m=>{E.push(m.table)}));let Re=br(t);Re&&_.addOrderBy(...Re.map(m=>({direction:m.direction,column:ge(m.column,l.dbType)}))),T&&T.length>0&&T.forEach(m=>_.addGroupBy(Sr(m,l.dbType)));let Qt=await P.find({where:{tableName:(0,ht.In)(E),datasource:{id:o}}});for(let m of Qt)if(m.columns)for(let U of m.columns)M.push({column:U.name,table:m.tableName||"",full:`${m.tableName}.${U.name}`,type:U.type});let G;if(c&&c.length>0?G=c.map(m=>Rr(m,l.dbType)):G=M.map(m=>`${m.full} as "${m.column}"`),_.selectColumns(G),N){let m=M.filter(U=>nt.includes(U.type)&&G.some(oe=>oe.startsWith(U.full)));if(m.length>0){let U=m.map(oe=>`LOWER(${oe.full}) LIKE '%${N.toLowerCase()}%'`);_.addWhereRaw(`(${U.join(" OR ")})`,"AND")}}return{...await(await L(q(l,!0),l.dbType,e)).executeQuery(_.toSQL(),{type:"SELECT",allowBulkUpdate:!1}),tables:E,allColumns:M}},wt=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:p})=>typeof u=="string"?u&&u.startsWith("=")?`${p}=${u.substring(1)}`:`${p}='${u}'`:`${p}='${u}'`).join(", "),a=t.filters.map(u=>Y(u,r.dbType)).join(" AND "),n=`UPDATE ${t.table} SET ${o} WHERE ${a}`;return(await L(q(r,!0),r.dbType,e)).executeQuery(n,{type:"UPDATE",allowBulkUpdate:!1})},Et=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}=Er(t.values),n=`INSERT INTO ${t.table} (${o}) VALUES (${a})`;return(await L(q(r,!0),r.dbType,e)).executeQuery(n,{type:"INSERT",allowBulkUpdate:!1})},Er=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}},Rr=(e,t)=>{if(e.fn){if(ee(e.fn))return`${(t==="postgres"?$:H)[e.fn](e)} as "${ye(e)}"`;throw new Error("Function not allowed: "+e.fn)}return`${e.value} as "${e.value}"`},Sr=(e,t)=>{if(e.fn){if(ee(e.fn))return(t==="postgres"?$:H)[e.fn]({...e,value:Tt(e.value,t)});throw new Error("Function not allowed: "+e.fn)}return Tt(e.value,t)},ge=(e,t)=>t==="postgres"?`"${e}"`:t==="mysql"?`\`${e}\``:e,Tt=(e,t)=>{let[r,o]=e.split(".");return ge(r,t)+"."+ge(o,t)},br=e=>{if(e.orderBy){if(e.columns&&e.columns.length>0){let t=e.columns.reduce((r,o)=>(r.add(ye(o)),r),new Set);return e.orderBy.filter(r=>t.has(r.column))}return e.orderBy}};var Rt=e=>{if(!e.table)throw new s(400,"Table is required")},Cr=["--",";","DROP","drop"],St=e=>{if(te(e.value)&&e.value.startsWith("=")){let t=e.value;Cr.forEach(r=>{if(t.includes(r))throw new s(400,"Invalid input value for "+e.column)})}},bt=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(St)},Ct=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=y(t,Rt);return{data:await gt(t,r)}}}),e.route({method:"post",url:"/insert",config:{requireRole:C("editor")},handler:async t=>{let r=y(t,bt);return{data:await Et(t,r)}}}),e.route({method:"post",url:"/update",config:{requireRole:C("editor")},handler:async t=>{let r=y(t,Ct);return{data:await wt(t,r)}}})});var It=w(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:d.str("SERVER_VERSION")}}))});var Ot=w(e=>{e.route({method:"get",url:"/:id/users",handler:async t=>{let{id:r}=S(t),o=await x.findOne({where:{id:r},relations:{users:{user:!0}}});if(!o)throw new s(404,"Team not found");return{data:o.users.map(a=>({role:a.role,id:a.user.id,name:a.user.username}))}}}),e.route({method:"post",url:"/",config:{requireRole:C("editor")},handler:async t=>g.transaction(async()=>{let r=t.user.id,o=y(t),a=R.create();a.id=r;let n=x.create(o);await x.save(n);let i=b.create({user:a,team:n});return await b.save(i),{data:n}})}),e.route({method:"patch",url:"/:id/user-role",config:{requireRole:C("admin")},handler:async t=>{let{id:r}=S(t),{role:o,userId:a}=y(t,({role:i})=>{if(i==="owner")throw new s(400,"Only one owner is allowed")});if((await b.findOneBy({user:{id:a},team:{id:r}}))?.role==="owner")throw new s(400,"Cannot change owner role");await b.update({user:{id:a},team:{id:r}},{role:o})}}),e.route({method:"delete",url:"/:id",config:{requireRole:C("admin")},handler:async t=>g.transaction(async()=>{let{id:r}=S(t),{userId:o}=v(t);if((await b.findOneBy({user:{id:o},team:{id:r}}))?.role==="owner")throw new s(400,"Cannot delete team owner");await R.update(o,{currentTeam:null}),await b.delete({user:{id:o},team:{id:r}}),await R.delete({id:o})})})});var we=O(require("bcryptjs")),W=async e=>{let t=await we.default.genSalt(10);return we.default.hash(e,t)};var At=w(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=await R.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=y(t);if(o.password&&(o.password=await W(o.password)),!(await R.update(r,o)).affected)throw new s(404,"User not found");let n=await R.findOne({where:{id:r},relations:{currentTeam:{team:!0}}});return{data:{id:n?.id,teamId:n?.currentTeam?.team.id,teamName:n?.currentTeam?.team.name,teamRole:n?.currentTeam?.role,username:n?.username}}}}),e.route({method:"post",url:"/",handler:async t=>g.transaction(async()=>{let r=y(t),o=await W(r.password),a=await R.save(R.create({username:r.username,password:o})),n=await b.save(b.create({role:"read_only",team:{id:r.teamId},user:{id:a.id}}));await R.update(a.id,{currentTeam:{id:n.id}})})})});var _t=w(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=t.user.id,o=await F.findOneBy({user:{id:r}});return o||(o=await F.save(F.create({user:{id:r}}))),{data:o}}}),e.route({method:"patch",url:"/",handler:async t=>{let{settings:r}=y(t);if(!r.id)throw new s(400,"Settings id is required!");if(!(await F.update(r.id,r)).affected)throw new s(404,"You do not own these settings!");return{data:await F.findOneBy({id:r.id})}}})});var Lt=require("node:path");var Nr=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),Pt=async e=>{if(Nr(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 Ye(o),n=await b.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 qt=O(require("@fastify/cookie"));var Ee={teamName:"Default Team",username:"admin",password:"admin"},Ir=async()=>{let e=await x.findOneBy({});return e||x.save(x.create({name:Ee.teamName}))},Ut=async()=>{let e=await b.findOne({where:{role:"owner"},relations:{user:!0}});if(e)return e.user;let t=await Ir(),r=await W(Ee.password),o=await R.save(R.create({username:Ee.username,password:r})),a=await b.save(b.create({user:o,team:t,role:"owner"}));return await R.update(o.id,{currentTeam:a}),o};var A=(0,xt.default)(),Ft=d.num("PORT",4466),Or=d.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),Ar="0.0.0.0",_r=[`http://localhost:${Ft}`,...Or];function D(e,t){A.register(e,{prefix:t}),console.log("Registered "+t)}(async function(){Ce(),await Qe(),await A.register(qt.default,{}),await A.register(vt.default,{origin:(t,r)=>{!t||_r.includes(t)?r(null,!0):r(new Error("Not allowed by CORS"),!1)},methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),await A.register(Mt.default,{root:(0,Lt.join)(__dirname,"web")}),A.get("/",(t,r)=>{r.sendFile("index.html")}),A.addHook("onRequest",Pt),A.addHook("onRequest",st),A.addHook("onResponse",Dt),D(Ke,"/api/auth"),D(it,"/api/data-sources"),D(ut,"/api/project"),D(mt,"/api/queries"),D(Nt,"/api/runner"),D(It,"/api/status"),D(Ot,"/api/teams"),D(At,"/api/users"),D(_t,"/api/user-settings"),A.setNotFoundHandler((t,r)=>{if(t.raw.url?.startsWith("/api/")){r.code(404).send({error:"API route not found"});return}r.sendFile("index.html")}),A.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 A.after(),await Me(),await Ut(),A.listen({port:Ft,host:Ar},(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),{})},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}'`),p=await mr(u,t);return{columns:a.map(c=>{let T=p[`${c.tableID}-${c.columnID}`];return{column:T?.column||c.name,alias:c.name,table:T?.table||"",full:T?T.table+"."+T.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)}},dr=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}},pr=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 ir(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:()=>lr(e,t),executeQuery:(n,i)=>a(()=>i.type==="SELECT"?pr(t,()=>et(n,t,i)):dr(t,()=>et(n,t,i))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.end()}}};var L=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 z=O(require("node:crypto"));var ot="aes-256-gcm",fr=12,at=()=>{let e=d.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},yr=e=>{let t=z.default.randomBytes(fr),r=at(),o=z.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")}},Tr=({encrypted:e,iv:t,tag:r})=>{let o=at(),a=z.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},J={encrypt:yr,decrypt:Tr};var q=(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 nt=[{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"}],hr=nt.reduce((e,t)=>(e[t.value]=t.label,e),{}),Go=nt.reduce((e,t)=>(e[t.label]=t.value,e),{}),B=e=>e.map(t=>({label:hr[t],value:t})),jo=B(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),Ko=B(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),Vo=B(["=","<>","IS NULL","IS NOT NULL"]),zo=B(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),Jo=B(["IS NULL","IS NOT NULL"]),Xo=B(["IN","NOT IN"]);var st=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"];var Zo=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var ye=e=>e.fn?e.distinct===!0?`${e.fn} distinct ${e.value}`:`${e.fn} ${e.value}`:e.value;var Te={read_only:10,editor:20,admin:30,owner:40};var C=e=>{let t=Te[e];return r=>Te[r]>=t},it=async e=>{let t=e.routeOptions.config.requireRole;if(t&&!t(e.user.currentTeamRole))throw new s(403,"You are not authorized to perform this action")};var ut=w(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=S(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}=v(t);return{data:await f.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",config:{requireRole:C("admin")},handler:async t=>{let{teamId:r,ownerId:o,...a}=y(t,ze),n=f.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),i=await L(q(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:p,encrypted:c}=J.encrypt(n.dbPassword);return n.dbPassword=c,n.dbPasswordIv=p,n.dbPasswordTag=u,{data:await f.save(n)}}}),e.route({method:"put",url:"/:id",config:{requireRole:C("admin")},handler:async t=>{let{id:r}=S(t),o=y(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",config:{requireRole:C("admin")},handler:async(t,r)=>g.transaction(async()=>{let{id:o}=S(t);await Promise.all([P.delete({datasource:{id:o}}),I.delete({dataSource:{id:o}})]),await f.delete({id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=S(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 L(q(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 f.save(a)}}),e.route({method:"get",url:"/:id/inspections",handler:async t=>{let{id:r}=S(t);return{data:await P.find({where:{datasource:{id:r}}})}}})});var he=require("typeorm"),ct=w(e=>{e.route({method:"get",url:"/team/:teamId/files",handler:async(t,r)=>{let{teamId:o}=S(t),a={where:{team:{id:o}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0}},[n=[],i=[]]=await Promise.all([f.find(a),I.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}=S(t),{search:o,size:a}=v(t),n=(parseInt(a)||20)/2,[i,u]=await Promise.all([P.find({where:{tableName:(0,he.Like)(`%${o}%`),datasource:{team:{id:r}}},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:n}),I.find({where:{name:(0,he.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})]),p=[];return i.forEach(c=>{p.push({name:c.tableName,id:c.id,dataSourceName:c.datasource?.name||"--",dataSourceId:c.datasource?.id||"--",type:"table"})}),u.forEach(c=>{p.push({name:c.name,id:c.id,dataSourceName:c.dataSource?.name||"--",dataSourceId:c.dataSource?.id||"--",type:"query"})}),{data:p}}})});function lt(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 mt=require("typeorm");var dt=w(e=>{e.route({method:"get",url:"/",handler:async t=>{let{dataSourceId:r,teamId:o,limit:a,orderBy:n,name:i}=v(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,mt.Like)(`%${i}%`)),{data:await I.find({where:u,take:a,order:lt(n,{createdAt:"DESC"})})}}}),e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=S(t),o=await I.findOne({where:{id:r},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return o?{data:o}:{status:404,data:"Query not found"}}}),e.route({method:"post",url:"/",config:{requireRole:C("editor")},handler:async t=>{let r=y(t),o=await f.findOne({where:{id:r.dataSourceId},relations:{team:!0}}),a=await I.save(I.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",config:{requireRole:C("editor")},handler:async t=>{let{id:r}=S(t),o=y(t);if(!(await I.update(r,o)).affected)throw new s(404,"Query not found");return{data:await I.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",config:{requireRole:C("editor")},handler:async t=>g.transaction(async()=>{let{id:r}=S(t);if(!(await I.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var X=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`},$={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:X,MAX:X,MIN:X,COUNT:X};var Z=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`},H={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 pt=["SUM","COUNT","AVG","MAX","MIN"],gr=["YEAR","MONTH","DAY",...pt],wr=gr.reduce((e,t)=>(e[t]=!0,e),{}),Er=pt.reduce((e,t)=>(e[t]=!0,e),{}),ee=e=>wr[e],ft=e=>Er[e],yt=(e,t)=>e.fn&&ee(e.fn)?(t==="postgres"?$:H)[e.fn](e):e.value;var te=e=>typeof e=="string",Tt=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},Y=(e,t)=>{let{column:r,operator:o,value:a,fn:n}=e,i=yt({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(l=>te(l.value)?`'${l.value}'`:l.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":"NOT LIKE"} '%${a?.[0].value}%'`;default:let T=a?.[0],N;return te(T?.value)&&T?.isColumn!==!0?N=`'${T?.value}'`:N=T?.value,`${i} ${o} ${N}`}};var re=class{constructor(t="mysql"){this.dialect=t,this.skeleton={type:"SELECT"}}addWhere(t){let r=Y(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=Y(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 Tt(this.skeleton)}};var gt=require("typeorm");var wt=async(e,t)=>{let{table:r,datasourceId:o,filters:a,joins:n,orderBy:i,size:u,page:p,columns:c,groupBy:T,searchAll:N}=t,l=await f.findOne({where:{id:o},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]}),E=[r],M=[];if(!l)throw new s(404,"Data source not found");let _=new re(l.dbType);_.setTable(r),_.setLimit(u||20),_.setOffset(u*p),a?.forEach(m=>{m.fn&&ft(m.fn)?_.addHaving(m):_.addWhere(m)}),n&&(_.addJoin(...n),n.forEach(m=>{E.push(m.table)}));let Re=Cr(t);Re&&_.addOrderBy(...Re.map(m=>({direction:m.direction,column:ge(m.column,l.dbType)}))),T&&T.length>0&&T.forEach(m=>_.addGroupBy(br(m,l.dbType)));let Qt=await P.find({where:{tableName:(0,gt.In)(E),datasource:{id:o}}});for(let m of Qt)if(m.columns)for(let U of m.columns)M.push({column:U.name,table:m.tableName||"",full:`${m.tableName}.${U.name}`,type:U.type});let G;if(c&&c.length>0?G=c.map(m=>Sr(m,l.dbType)):G=M.map(m=>`${m.full} as "${m.column}"`),_.selectColumns(G),N){let m=M.filter(U=>st.includes(U.type)&&G.some(oe=>oe.startsWith(U.full)));if(m.length>0){let U=m.map(oe=>`LOWER(${oe.full}) LIKE '%${N.toLowerCase()}%'`);_.addWhereRaw(`(${U.join(" OR ")})`,"AND")}}return{...await(await L(q(l,!0),l.dbType,e)).executeQuery(_.toSQL(),{type:"SELECT",allowBulkUpdate:!1}),tables:E,allColumns:M}},Et=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:p})=>typeof u=="string"?u&&u.startsWith("=")?`${p}=${u.substring(1)}`:`${p}='${u}'`:`${p}='${u}'`).join(", "),a=t.filters.map(u=>Y(u,r.dbType)).join(" AND "),n=`UPDATE ${t.table} SET ${o} WHERE ${a}`;return(await L(q(r,!0),r.dbType,e)).executeQuery(n,{type:"UPDATE",allowBulkUpdate:!1})},Rt=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}=Rr(t.values),n=`INSERT INTO ${t.table} (${o}) VALUES (${a})`;return(await L(q(r,!0),r.dbType,e)).executeQuery(n,{type:"INSERT",allowBulkUpdate:!1})},Rr=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}},Sr=(e,t)=>{if(e.fn){if(ee(e.fn))return`${(t==="postgres"?$:H)[e.fn](e)} as "${ye(e)}"`;throw new Error("Function not allowed: "+e.fn)}return`${e.value} as "${e.value}"`},br=(e,t)=>{if(e.fn){if(ee(e.fn))return(t==="postgres"?$:H)[e.fn]({...e,value:ht(e.value,t)});throw new Error("Function not allowed: "+e.fn)}return ht(e.value,t)},ge=(e,t)=>t==="postgres"?`"${e}"`:t==="mysql"?`\`${e}\``:e,ht=(e,t)=>{let[r,o]=e.split(".");return ge(r,t)+"."+ge(o,t)},Cr=e=>{if(e.orderBy){if(e.columns&&e.columns.length>0){let t=e.columns.reduce((r,o)=>(r.add(ye(o)),r),new Set);return e.orderBy.filter(r=>t.has(r.column))}return e.orderBy}};var St=e=>{if(!e.table)throw new s(400,"Table is required")},Nr=["--",";","DROP","drop"],bt=e=>{if(te(e.value)&&e.value.startsWith("=")){let t=e.value;Nr.forEach(r=>{if(t.includes(r))throw new s(400,"Invalid input value for "+e.column)})}},Ct=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(bt)},Nt=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(bt)};var It=w(e=>{e.route({method:"post",url:"/select",handler:async t=>{let r=y(t,St);return{data:await wt(t,r)}}}),e.route({method:"post",url:"/insert",config:{requireRole:C("editor")},handler:async t=>{let r=y(t,Ct);return{data:await Rt(t,r)}}}),e.route({method:"post",url:"/update",config:{requireRole:C("editor")},handler:async t=>{let r=y(t,Nt);return{data:await Et(t,r)}}})});var Ot=w(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:d.str("SERVER_VERSION")}}))});var At=w(e=>{e.route({method:"get",url:"/:id/users",handler:async t=>{let{id:r}=S(t),o=await x.findOne({where:{id:r},relations:{users:{user:!0}}});if(!o)throw new s(404,"Team not found");return{data:o.users.map(a=>({role:a.role,id:a.user.id,name:a.user.username}))}}}),e.route({method:"post",url:"/",config:{requireRole:C("editor")},handler:async t=>g.transaction(async()=>{let r=t.user.id,o=y(t),a=R.create();a.id=r;let n=x.create(o);await x.save(n);let i=b.create({user:a,team:n});return await b.save(i),{data:n}})}),e.route({method:"patch",url:"/:id/user-role",config:{requireRole:C("admin")},handler:async t=>{let{id:r}=S(t),{role:o,userId:a}=y(t,({role:i})=>{if(i==="owner")throw new s(400,"Only one owner is allowed")});if((await b.findOneBy({user:{id:a},team:{id:r}}))?.role==="owner")throw new s(400,"Cannot change owner role");await b.update({user:{id:a},team:{id:r}},{role:o})}}),e.route({method:"delete",url:"/:id",config:{requireRole:C("admin")},handler:async t=>g.transaction(async()=>{let{id:r}=S(t),{userId:o}=v(t);if((await b.findOneBy({user:{id:o},team:{id:r}}))?.role==="owner")throw new s(400,"Cannot delete team owner");await R.update(o,{currentTeam:null}),await b.delete({user:{id:o},team:{id:r}}),await R.delete({id:o})})})});var we=O(require("bcryptjs")),W=async e=>{let t=await we.default.genSalt(10);return we.default.hash(e,t)};var _t=w(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=await R.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=y(t);if(o.password&&(o.password=await W(o.password)),!(await R.update(r,o)).affected)throw new s(404,"User not found");let n=await R.findOne({where:{id:r},relations:{currentTeam:{team:!0}}});return{data:{id:n?.id,teamId:n?.currentTeam?.team.id,teamName:n?.currentTeam?.team.name,teamRole:n?.currentTeam?.role,username:n?.username}}}}),e.route({method:"post",url:"/",handler:async t=>g.transaction(async()=>{let r=y(t),o=await W(r.password),a=await R.save(R.create({username:r.username,password:o})),n=await b.save(b.create({role:"read_only",team:{id:r.teamId},user:{id:a.id}}));await R.update(a.id,{currentTeam:{id:n.id}})})})});var Pt=w(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=t.user.id,o=await F.findOneBy({user:{id:r}});return o||(o=await F.save(F.create({user:{id:r}}))),{data:o}}}),e.route({method:"patch",url:"/",handler:async t=>{let{settings:r}=y(t);if(!r.id)throw new s(400,"Settings id is required!");if(!(await F.update(r.id,r)).affected)throw new s(404,"You do not own these settings!");return{data:await F.findOneBy({id:r.id})}}})});var qt=require("node:path");var Ir=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),Dt=async e=>{if(Ir(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 We(o),n=await b.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 Ut=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Ft=O(require("@fastify/cookie"));var Ee={teamName:"Default Team",username:"admin",password:"admin"},Or=async()=>{let e=await x.findOneBy({});return e||x.save(x.create({name:Ee.teamName}))},xt=async()=>{let e=await b.findOne({where:{role:"owner"},relations:{user:!0}});if(e)return e.user;let t=await Or(),r=await W(Ee.password),o=await R.save(R.create({username:Ee.username,password:r})),a=await b.save(b.create({user:o,team:t,role:"owner"}));return await R.update(o.id,{currentTeam:a}),o};var A=(0,vt.default)(),Bt=d.num("PORT",4466),Ar=d.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),_r="0.0.0.0",Pr=[`http://localhost:${Bt}`,...Ar];function D(e,t){A.register(e,{prefix:t}),console.log("Registered "+t)}(async function(){Ne(),await Qe(),await A.register(Ft.default,{}),await A.register(Mt.default,{origin:(t,r)=>{!t||Pr.includes(t)?r(null,!0):r(new Error("Not allowed by CORS"),!1)},methods:["GET","POST","PUT","PATCH","DELETE","OPTIONS"],credentials:!0}),await A.register(Lt.default,{root:(0,qt.join)(__dirname,"web")}),A.get("/",(t,r)=>{r.sendFile("index.html")}),A.addHook("onRequest",Dt),A.addHook("onRequest",it),A.addHook("onResponse",Ut),D(Ve,"/api/auth"),D(ut,"/api/data-sources"),D(ct,"/api/project"),D(dt,"/api/queries"),D(It,"/api/runner"),D(Ot,"/api/status"),D(At,"/api/teams"),D(_t,"/api/users"),D(Pt,"/api/user-settings"),A.setNotFoundHandler((t,r)=>{if(t.raw.url?.startsWith("/api/")){r.code(404).send({error:"API route not found"});return}r.sendFile("index.html")}),A.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 A.after(),await Le(),await xt(),A.listen({port:Bt,host:_r},(t,r)=>{t&&(console.error(t),process.exit(1)),console.log(`Server listening at ${r}`)})})();
@@ -264,7 +264,7 @@ to {
264
264
  `}),i}function Mb(e){let n=0,i=e.charCodeAt(n);for(;i===9||i===32;)n++,i=e.charCodeAt(n);return e.slice(n)}function Lb(e,n){const i=E8(e,n),l=i.one(e,void 0),s=S8(i),o=Array.isArray(l)?{type:"root",children:l}:l||{type:"root",children:[]};return s&&o.children.push({type:"text",value:`
265
265
  `},s),o}function N8(e,n){return e&&"run"in e?async function(i,l){const s=Lb(i,{file:l,...n});await e.run(s,l)}:function(i,l){return Lb(i,{file:l,...e||n})}}function zb(e){if(e)throw e}var wh,Ub;function R8(){if(Ub)return wh;Ub=1;var e=Object.prototype.hasOwnProperty,n=Object.prototype.toString,i=Object.defineProperty,l=Object.getOwnPropertyDescriptor,s=function(h){return typeof Array.isArray=="function"?Array.isArray(h):n.call(h)==="[object Array]"},o=function(h){if(!h||n.call(h)!=="[object Object]")return!1;var m=e.call(h,"constructor"),g=h.constructor&&h.constructor.prototype&&e.call(h.constructor.prototype,"isPrototypeOf");if(h.constructor&&!m&&!g)return!1;var x;for(x in h);return typeof x>"u"||e.call(h,x)},c=function(h,m){i&&m.name==="__proto__"?i(h,m.name,{enumerable:!0,configurable:!0,value:m.newValue,writable:!0}):h[m.name]=m.newValue},f=function(h,m){if(m==="__proto__")if(e.call(h,m)){if(l)return l(h,m).value}else return;return h[m]};return wh=function d(){var h,m,g,x,v,w,A=arguments[0],_=1,k=arguments.length,O=!1;for(typeof A=="boolean"&&(O=A,A=arguments[1]||{},_=2),(A==null||typeof A!="object"&&typeof A!="function")&&(A={});_<k;++_)if(h=arguments[_],h!=null)for(m in h)g=f(A,m),x=f(h,m),A!==x&&(O&&x&&(o(x)||(v=s(x)))?(v?(v=!1,w=g&&s(g)?g:[]):w=g&&o(g)?g:{},c(A,{name:m,newValue:d(O,w,x)})):typeof x<"u"&&c(A,{name:m,newValue:x}));return A},wh}var O8=R8();const Sh=Ca(O8);function up(e){if(typeof e!="object"||e===null)return!1;const n=Object.getPrototypeOf(e);return(n===null||n===Object.prototype||Object.getPrototypeOf(n)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)}function j8(){const e=[],n={run:i,use:l};return n;function i(...s){let o=-1;const c=s.pop();if(typeof c!="function")throw new TypeError("Expected function as last argument, not "+c);f(null,...s);function f(d,...h){const m=e[++o];let g=-1;if(d){c(d);return}for(;++g<s.length;)(h[g]===null||h[g]===void 0)&&(h[g]=s[g]);s=h,m?D8(m,f)(...h):c(null,...h)}}function l(s){if(typeof s!="function")throw new TypeError("Expected `middelware` to be a function, not "+s);return e.push(s),n}}function D8(e,n){let i;return l;function l(...c){const f=e.length>c.length;let d;f&&c.push(s);try{d=e.apply(this,c)}catch(h){const m=h;if(f&&i)throw m;return s(m)}f||(d&&d.then&&typeof d.then=="function"?d.then(o,s):d instanceof Error?s(d):o(d))}function s(c,...f){i||(i=!0,n(c,...f))}function o(c){s(null,c)}}const wr={basename:M8,dirname:L8,extname:z8,join:U8,sep:"/"};function M8(e,n){if(n!==void 0&&typeof n!="string")throw new TypeError('"ext" argument must be a string');go(e);let i=0,l=-1,s=e.length,o;if(n===void 0||n.length===0||n.length>e.length){for(;s--;)if(e.codePointAt(s)===47){if(o){i=s+1;break}}else l<0&&(o=!0,l=s+1);return l<0?"":e.slice(i,l)}if(n===e)return"";let c=-1,f=n.length-1;for(;s--;)if(e.codePointAt(s)===47){if(o){i=s+1;break}}else c<0&&(o=!0,c=s+1),f>-1&&(e.codePointAt(s)===n.codePointAt(f--)?f<0&&(l=s):(f=-1,l=c));return i===l?l=c:l<0&&(l=e.length),e.slice(i,l)}function L8(e){if(go(e),e.length===0)return".";let n=-1,i=e.length,l;for(;--i;)if(e.codePointAt(i)===47){if(l){n=i;break}}else l||(l=!0);return n<0?e.codePointAt(0)===47?"/":".":n===1&&e.codePointAt(0)===47?"//":e.slice(0,n)}function z8(e){go(e);let n=e.length,i=-1,l=0,s=-1,o=0,c;for(;n--;){const f=e.codePointAt(n);if(f===47){if(c){l=n+1;break}continue}i<0&&(c=!0,i=n+1),f===46?s<0?s=n:o!==1&&(o=1):s>-1&&(o=-1)}return s<0||i<0||o===0||o===1&&s===i-1&&s===l+1?"":e.slice(s,i)}function U8(...e){let n=-1,i;for(;++n<e.length;)go(e[n]),e[n]&&(i=i===void 0?e[n]:i+"/"+e[n]);return i===void 0?".":B8(i)}function B8(e){go(e);const n=e.codePointAt(0)===47;let i=q8(e,!n);return i.length===0&&!n&&(i="."),i.length>0&&e.codePointAt(e.length-1)===47&&(i+="/"),n?"/"+i:i}function q8(e,n){let i="",l=0,s=-1,o=0,c=-1,f,d;for(;++c<=e.length;){if(c<e.length)f=e.codePointAt(c);else{if(f===47)break;f=47}if(f===47){if(!(s===c-1||o===1))if(s!==c-1&&o===2){if(i.length<2||l!==2||i.codePointAt(i.length-1)!==46||i.codePointAt(i.length-2)!==46){if(i.length>2){if(d=i.lastIndexOf("/"),d!==i.length-1){d<0?(i="",l=0):(i=i.slice(0,d),l=i.length-1-i.lastIndexOf("/")),s=c,o=0;continue}}else if(i.length>0){i="",l=0,s=c,o=0;continue}}n&&(i=i.length>0?i+"/..":"..",l=2)}else i.length>0?i+="/"+e.slice(s+1,c):i=e.slice(s+1,c),l=c-s-1;s=c,o=0}else f===46&&o>-1?o++:o=-1}return i}function go(e){if(typeof e!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}const H8={cwd:F8};function F8(){return"/"}function cp(e){return!!(e!==null&&typeof e=="object"&&"href"in e&&e.href&&"protocol"in e&&e.protocol&&e.auth===void 0)}function P8(e){if(typeof e=="string")e=new URL(e);else if(!cp(e)){const n=new TypeError('The "path" argument must be of type string or an instance of URL. Received `'+e+"`");throw n.code="ERR_INVALID_ARG_TYPE",n}if(e.protocol!=="file:"){const n=new TypeError("The URL must be of scheme file");throw n.code="ERR_INVALID_URL_SCHEME",n}return Q8(e)}function Q8(e){if(e.hostname!==""){const l=new TypeError('File URL host must be "localhost" or empty on darwin');throw l.code="ERR_INVALID_FILE_URL_HOST",l}const n=e.pathname;let i=-1;for(;++i<n.length;)if(n.codePointAt(i)===37&&n.codePointAt(i+1)===50){const l=n.codePointAt(i+2);if(l===70||l===102){const s=new TypeError("File URL path must not include encoded / characters");throw s.code="ERR_INVALID_FILE_URL_PATH",s}}return decodeURIComponent(n)}const Ch=["history","path","basename","stem","extname","dirname"];class Dw{constructor(n){let i;n?cp(n)?i={path:n}:typeof n=="string"||I8(n)?i={value:n}:i=n:i={},this.cwd="cwd"in i?"":H8.cwd(),this.data={},this.history=[],this.messages=[],this.value,this.map,this.result,this.stored;let l=-1;for(;++l<Ch.length;){const o=Ch[l];o in i&&i[o]!==void 0&&i[o]!==null&&(this[o]=o==="history"?[...i[o]]:i[o])}let s;for(s in i)Ch.includes(s)||(this[s]=i[s])}get basename(){return typeof this.path=="string"?wr.basename(this.path):void 0}set basename(n){Ah(n,"basename"),Eh(n,"basename"),this.path=wr.join(this.dirname||"",n)}get dirname(){return typeof this.path=="string"?wr.dirname(this.path):void 0}set dirname(n){Bb(this.basename,"dirname"),this.path=wr.join(n||"",this.basename)}get extname(){return typeof this.path=="string"?wr.extname(this.path):void 0}set extname(n){if(Eh(n,"extname"),Bb(this.dirname,"extname"),n){if(n.codePointAt(0)!==46)throw new Error("`extname` must start with `.`");if(n.includes(".",1))throw new Error("`extname` cannot contain multiple dots")}this.path=wr.join(this.dirname,this.stem+(n||""))}get path(){return this.history[this.history.length-1]}set path(n){cp(n)&&(n=P8(n)),Ah(n,"path"),this.path!==n&&this.history.push(n)}get stem(){return typeof this.path=="string"?wr.basename(this.path,this.extname):void 0}set stem(n){Ah(n,"stem"),Eh(n,"stem"),this.path=wr.join(this.dirname||"",n+(this.extname||""))}fail(n,i,l){const s=this.message(n,i,l);throw s.fatal=!0,s}info(n,i,l){const s=this.message(n,i,l);return s.fatal=void 0,s}message(n,i,l){const s=new nn(n,i,l);return this.path&&(s.name=this.path+":"+s.name,s.file=this.path),s.fatal=!1,this.messages.push(s),s}toString(n){return this.value===void 0?"":typeof this.value=="string"?this.value:new TextDecoder(n||void 0).decode(this.value)}}function Eh(e,n){if(e&&e.includes(wr.sep))throw new Error("`"+n+"` cannot be a path: did not expect `"+wr.sep+"`")}function Ah(e,n){if(!e)throw new Error("`"+n+"` cannot be empty")}function Bb(e,n){if(!e)throw new Error("Setting `"+n+"` requires `path` to be set too")}function I8(e){return!!(e&&typeof e=="object"&&"byteLength"in e&&"byteOffset"in e)}const V8=function(e){const l=this.constructor.prototype,s=l[e],o=function(){return s.apply(o,arguments)};return Object.setPrototypeOf(o,l),o},$8={}.hasOwnProperty;class rm extends V8{constructor(){super("copy"),this.Compiler=void 0,this.Parser=void 0,this.attachers=[],this.compiler=void 0,this.freezeIndex=-1,this.frozen=void 0,this.namespace={},this.parser=void 0,this.transformers=j8()}copy(){const n=new rm;let i=-1;for(;++i<this.attachers.length;){const l=this.attachers[i];n.use(...l)}return n.data(Sh(!0,{},this.namespace)),n}data(n,i){return typeof n=="string"?arguments.length===2?(_h("data",this.frozen),this.namespace[n]=i,this):$8.call(this.namespace,n)&&this.namespace[n]||void 0:n?(_h("data",this.frozen),this.namespace=n,this):this.namespace}freeze(){if(this.frozen)return this;const n=this;for(;++this.freezeIndex<this.attachers.length;){const[i,...l]=this.attachers[this.freezeIndex];if(l[0]===!1)continue;l[0]===!0&&(l[0]=void 0);const s=i.call(n,...l);typeof s=="function"&&this.transformers.use(s)}return this.frozen=!0,this.freezeIndex=Number.POSITIVE_INFINITY,this}parse(n){this.freeze();const i=Mu(n),l=this.parser||this.Parser;return Th("parse",l),l(String(i),i)}process(n,i){const l=this;return this.freeze(),Th("process",this.parser||this.Parser),kh("process",this.compiler||this.Compiler),i?s(void 0,i):new Promise(s);function s(o,c){const f=Mu(n),d=l.parse(f);l.run(d,f,function(m,g,x){if(m||!g||!x)return h(m);const v=g,w=l.stringify(v,x);G8(w)?x.value=w:x.result=w,h(m,x)});function h(m,g){m||!g?c(m):o?o(g):i(void 0,g)}}}processSync(n){let i=!1,l;return this.freeze(),Th("processSync",this.parser||this.Parser),kh("processSync",this.compiler||this.Compiler),this.process(n,s),Hb("processSync","process",i),l;function s(o,c){i=!0,zb(o),l=c}}run(n,i,l){qb(n),this.freeze();const s=this.transformers;return!l&&typeof i=="function"&&(l=i,i=void 0),l?o(void 0,l):new Promise(o);function o(c,f){const d=Mu(i);s.run(n,d,h);function h(m,g,x){const v=g||n;m?f(m):c?c(v):l(void 0,v,x)}}}runSync(n,i){let l=!1,s;return this.run(n,i,o),Hb("runSync","run",l),s;function o(c,f){zb(c),s=f,l=!0}}stringify(n,i){this.freeze();const l=Mu(i),s=this.compiler||this.Compiler;return kh("stringify",s),qb(n),s(n,l)}use(n,...i){const l=this.attachers,s=this.namespace;if(_h("use",this.frozen),n!=null)if(typeof n=="function")d(n,i);else if(typeof n=="object")Array.isArray(n)?f(n):c(n);else throw new TypeError("Expected usable value, not `"+n+"`");return this;function o(h){if(typeof h=="function")d(h,[]);else if(typeof h=="object")if(Array.isArray(h)){const[m,...g]=h;d(m,g)}else c(h);else throw new TypeError("Expected usable value, not `"+h+"`")}function c(h){if(!("plugins"in h)&&!("settings"in h))throw new Error("Expected usable value but received an empty preset, which is probably a mistake: presets typically come with `plugins` and sometimes with `settings`, but this has neither");f(h.plugins),h.settings&&(s.settings=Sh(!0,s.settings,h.settings))}function f(h){let m=-1;if(h!=null)if(Array.isArray(h))for(;++m<h.length;){const g=h[m];o(g)}else throw new TypeError("Expected a list of plugins, not `"+h+"`")}function d(h,m){let g=-1,x=-1;for(;++g<l.length;)if(l[g][0]===h){x=g;break}if(x===-1)l.push([h,...m]);else if(m.length>0){let[v,...w]=m;const A=l[x][1];up(A)&&up(v)&&(v=Sh(!0,A,v)),l[x]=[h,v,...w]}}}}const Y8=new rm().freeze();function Th(e,n){if(typeof n!="function")throw new TypeError("Cannot `"+e+"` without `parser`")}function kh(e,n){if(typeof n!="function")throw new TypeError("Cannot `"+e+"` without `compiler`")}function _h(e,n){if(n)throw new Error("Cannot call `"+e+"` on a frozen processor.\nCreate a new processor first, by calling it: use `processor()` instead of `processor`.")}function qb(e){if(!up(e)||typeof e.type!="string")throw new TypeError("Expected node, got `"+e+"`")}function Hb(e,n,i){if(!i)throw new Error("`"+e+"` finished async. Use `"+n+"` instead")}function Mu(e){return K8(e)?e:new Dw(e)}function K8(e){return!!(e&&typeof e=="object"&&"message"in e&&"messages"in e)}function G8(e){return typeof e=="string"||X8(e)}function X8(e){return!!(e&&typeof e=="object"&&"byteLength"in e&&"byteOffset"in e)}const Z8="https://github.com/remarkjs/react-markdown/blob/main/changelog.md",Fb=[],Pb={allowDangerousHtml:!0},J8=/^(https?|ircs?|mailto|xmpp)$/i,W8=[{from:"astPlugins",id:"remove-buggy-html-in-markdown-parser"},{from:"allowDangerousHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"allowNode",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowElement"},{from:"allowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"allowedElements"},{from:"className",id:"remove-classname"},{from:"disallowedTypes",id:"replace-allownode-allowedtypes-and-disallowedtypes",to:"disallowedElements"},{from:"escapeHtml",id:"remove-buggy-html-in-markdown-parser"},{from:"includeElementIndex",id:"#remove-includeelementindex"},{from:"includeNodeIndex",id:"change-includenodeindex-to-includeelementindex"},{from:"linkTarget",id:"remove-linktarget"},{from:"plugins",id:"change-plugins-to-remarkplugins",to:"remarkPlugins"},{from:"rawSourcePos",id:"#remove-rawsourcepos"},{from:"renderers",id:"change-renderers-to-components",to:"components"},{from:"source",id:"change-source-to-children",to:"children"},{from:"sourcePos",id:"#remove-sourcepos"},{from:"transformImageUri",id:"#add-urltransform",to:"urlTransform"},{from:"transformLinkUri",id:"#add-urltransform",to:"urlTransform"}];function eM(e){const n=tM(e),i=nM(e);return rM(n.runSync(n.parse(i),i),e)}function tM(e){const n=e.rehypePlugins||Fb,i=e.remarkPlugins||Fb,l=e.remarkRehypeOptions?{...e.remarkRehypeOptions,...Pb}:Pb;return Y8().use(QD).use(i).use(N8,l).use(n)}function nM(e){const n=e.children||"",i=new Dw;return typeof n=="string"&&(i.value=n),i}function rM(e,n){const i=n.allowedElements,l=n.allowElement,s=n.components,o=n.disallowedElements,c=n.skipHtml,f=n.unwrapDisallowed,d=n.urlTransform||iM;for(const m of W8)Object.hasOwn(n,m.from)&&(""+m.from+(m.to?"use `"+m.to+"` instead":"remove it")+Z8+m.id,void 0);return Fp(e,h),Z5(e,{Fragment:b.Fragment,components:s,ignoreInvalidStyle:!0,jsx:b.jsx,jsxs:b.jsxs,passKeys:!0,passNode:!0});function h(m,g,x){if(m.type==="raw"&&x&&typeof g=="number")return c?x.children.splice(g,1):x.children[g]={type:"text",value:m.value},g;if(m.type==="element"){let v;for(v in xh)if(Object.hasOwn(xh,v)&&Object.hasOwn(m.properties,v)){const w=m.properties[v],A=xh[v];(A===null||A.includes(m.tagName))&&(m.properties[v]=d(String(w||""),v,m))}}if(m.type==="element"){let v=i?!i.includes(m.tagName):o?o.includes(m.tagName):!1;if(!v&&l&&typeof g=="number"&&(v=!l(m,g,x)),v&&x&&typeof g=="number")return f&&m.children?x.children.splice(g,1,...m.children):x.children.splice(g,1),g}}}function iM(e){const n=e.indexOf(":"),i=e.indexOf("?"),l=e.indexOf("#"),s=e.indexOf("/");return n===-1||s!==-1&&n>s||i!==-1&&n>i||l!==-1&&n>l||J8.test(e.slice(0,n))?e:""}const lM=({children:e,...n})=>b.jsx("code",{className:"bg-gray-100 text-gray-600 px-1.5 py-0.5 rounded text-sm font-mono",...n,children:e}),aM=e=>Array.isArray(e)&&typeof e[0]=="string"?e[0]:typeof e=="string"?e:"",sM=({getText:e})=>{const n=async()=>{await navigator.clipboard.writeText(e()),un.success("Copied!")};return b.jsx("button",{onClick:n,className:"text-xs text-white px-2 py-1 rounded hover:bg-gray-600 cursor-pointer",children:"📋"})},oM=({children:e,className:n,...i})=>{const l=(n==null?void 0:n.replace("language-",""))||"";return b.jsxs("div",{className:"mb-4 not-prose",children:[l&&b.jsxs("div",{className:"bg-gray-800 text-gray-300 px-4 py-2 text-sm font-mono rounded-t-md flex justify-between items-center",children:[b.jsx("span",{children:l}),b.jsx(sM,{getText:()=>aM(e).trim()})]}),b.jsx("pre",{className:`bg-gray-900 text-gray-100 p-4 overflow-x-auto ${l?"rounded-b-md":"rounded-md"}`,...i,children:b.jsx("code",{className:"font-mono text-sm",children:e})})]})},uM={code:({className:e,children:n,...i})=>e?b.jsx(oM,{className:e,...i,children:n}):b.jsx(lM,{...i,children:n}),pre:({children:e})=>b.jsx(b.Fragment,{children:e})},cM=({content:e})=>b.jsx("div",{className:"prose max-w-none",children:b.jsx(eM,{remarkPlugins:[S5],components:uM,children:e})}),fM=`### ⚠️ You are running an outdated local server version.
266
266
 
267
- Please update your local server version to **0.0.63**
267
+ Please update your local server version to **0.0.64**
268
268
 
269
269
  ### 🔧 Update Command
270
270
 
@@ -281,4 +281,4 @@ dataramen start
281
281
  \`\`\`
282
282
 
283
283
  Once done, click on the "Check again" button below or refresh the page.
284
- `,dM=()=>{const{data:e,refetch:n}=DR();return!(e!=null&&e.active)||MR(e.version,"0.0.63")===0?null:b.jsx(tn,{isVisible:!0,onClose:()=>null,children:b.jsxs("div",{children:[b.jsx(cM,{content:fM}),b.jsx("div",{className:"flex justify-end mt-2",children:b.jsx("button",{className:"button primary",onClick:()=>n(),children:"Check again"})})]})})},[hM,Mw]=zn(!1),Nh=()=>Mw(!1),pM=()=>Mw(!0),mM=({repeatPassword:e,password:n})=>n.length<1?null:n.length<8?b.jsx(gn,{variant:"warning",children:"New password should be at least 8 characters long"}):n!==e?b.jsx(gn,{variant:"warning",children:"Repeat password should match new password"}):null,yM=()=>{const e=hM(),{data:n}=kr(),{mutateAsync:i,isLoading:l}=jA(),s=Tr(),[{password:o,repeatPassword:c},{change:f,touched:d,reset:h}]=oo({password:"",repeatPassword:""}),m=()=>{s("/"),ao.logout().then(()=>{Nh()})},g=()=>{i({password:o}).then(()=>{h(),un.success("Password successfully updated!")})},x=o.length<8||o!==c||l,v=d.includes("password");return b.jsxs(tn,{isVisible:e,onClose:Nh,children:[b.jsx(er,{onClick:Nh}),b.jsxs("div",{className:"w-full lg:w-lg flex flex-col gap-2",children:[b.jsx(nx,{children:"Account settings"}),b.jsxs("label",{children:[b.jsx("p",{className:"text-xs font-semibold mb-1",children:"Username"}),b.jsx("input",{className:"input w-full",readOnly:!0,disabled:!0,value:n==null?void 0:n.username})]}),b.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[b.jsxs("label",{children:[b.jsx("p",{className:"text-xs font-semibold mb-1",children:"Change password"}),b.jsx("input",{className:"input w-full",type:"password",name:"newPassword",autoComplete:"new-password",value:o,onChange:f("password")})]}),b.jsxs("label",{children:[b.jsx("p",{className:"text-xs font-semibold mb-1",children:"Repeat password"}),b.jsx("input",{className:"input w-full",type:"password",value:c,onChange:f("repeatPassword")})]})]}),v&&b.jsx(mM,{password:o,repeatPassword:c}),b.jsxs("div",{className:"flex justify-end gap-2 mt-2",children:[b.jsx("button",{className:"button tertiary",disabled:x,onClick:g,children:"Update password"}),b.jsx("button",{className:"button danger",onClick:m,children:"Log out"})]})]})]})},[gM,Lw]=zn(!1),bM=()=>Lw(!0),Qb=()=>Lw(!1),vM=e=>Wn({queryKey:["team-users"],queryFn:async()=>{const{data:n}=await at.get("/teams/"+e+"/users");return n.data},enabled:!!e}),xM=()=>Jn({mutationFn:async({role:e,teamId:n,userId:i})=>(await at.patch("/teams/"+n+"/user-role",{role:e,userId:i}),!0),onSuccess:()=>{xt.invalidateQueries({queryKey:["team-users"]})}}),wM=()=>Jn({mutationFn:async({teamId:e,userId:n})=>(await at.delete("/teams/"+e,{params:{userId:n}}),!0),onSuccess:()=>{xt.invalidateQueries({queryKey:["team-users"]})}}),SM="_user-entry_n81ze_2",CM={userEntry:SM},EM=()=>{const e=gM(),{data:n}=kr(),{data:i}=vM(n==null?void 0:n.teamId),{mutate:l,isLoading:s}=DA(),{mutate:o,isLoading:c}=xM(),{mutate:f,isLoading:d}=wM(),[h,{change:m,reset:g}]=oo({password:"",username:""}),x=()=>{l({username:h.username,password:h.password,teamId:(n==null?void 0:n.teamId)||""}),g()},v=(k,O)=>{o({teamId:n.teamId,role:O,userId:k})},w=k=>{rx("Are you sure you want to remove this user?").then(O=>{O&&f({userId:k,teamId:n.teamId})})},A=Da(sn.ADMIN),_=s||c||d;return b.jsxs(tn,{isVisible:e,onClose:Qb,backdropClose:!0,children:[b.jsx(er,{onClick:Qb}),b.jsxs("div",{className:"w-full lg:w-lg flex flex-col overflow-hidden",children:[b.jsx(nx,{children:"Manage users"}),Nc(i==null?void 0:i.length,0)&&b.jsx("div",{className:"mt-4 overflow-y-auto flex-1",children:i.map(k=>b.jsxs("div",{className:CM.userEntry,children:[b.jsxs("select",{className:"input",value:k.role,disabled:!A||_,onChange:O=>v(k.id,O.currentTarget.value),children:[b.jsx("option",{value:sn.OWNER,children:"Owner"}),b.jsx("option",{value:sn.ADMIN,children:"Admin"}),b.jsx("option",{value:sn.EDITOR,children:"Editor"}),b.jsx("option",{value:sn.READ_ONLY,children:"Reader"})]}),b.jsx("p",{className:"flex-1 mx-2",children:k.name}),A&&b.jsx("button",{className:"p-1 cursor-pointer text-red-500 text-sm",onClick:()=>w(k.id),children:"❌"})]},k.id))}),A&&b.jsxs("div",{className:"mt-4",children:[b.jsx("p",{className:"font-semibold",children:"Create new user"}),b.jsxs("div",{className:"flex flex-col lg:flex-row gap-2 lg:items-center mt-2",children:[b.jsx("input",{className:"input flex-1",onChange:m("username"),value:h.username,placeholder:"Username",disabled:_}),b.jsx("input",{className:"input",onChange:m("password"),value:h.password,type:"password",name:"newPassword",autoComplete:"new-password",placeholder:"Password",disabled:_}),b.jsx("button",{className:"button primary",onClick:x,disabled:_,children:"Create user"})]}),b.jsx("p",{className:"text-xs mt-1 text-gray-600",children:"You should create default password for the new account. The user should change it after the first login."})]})]})]})},AM=()=>{const[e,n]=E.useState(""),[i,l]=E.useState(""),[s,o]=E.useState(),[c,f]=E.useState(!1),d=Tr(),h=m=>{m.preventDefault(),o(void 0),ao.login({password:i,username:e}).then(()=>{d("/",{replace:!0})}).catch(o)};return b.jsx("div",{className:"page-container bg-(--bg) h-screen",children:b.jsx("div",{className:"page-content items-center",children:b.jsxs("form",{className:"flex flex-col gap-2 w-full lg:w-lg",onSubmit:h,children:[b.jsx("p",{className:"font-semibold text-xl min-w-md",children:"Login"}),s&&b.jsx(gn,{variant:"danger",children:"Failed to login. Please verify your credentials"}),b.jsx("input",{value:e,onChange:m=>n(m.currentTarget.value),className:"input",placeholder:"User name"}),b.jsx("input",{value:i,onChange:m=>l(m.currentTarget.value),className:"input",type:"password",placeholder:"Password"}),b.jsx("button",{type:"submit",className:"button primary",children:"Login"}),c?b.jsxs(gn,{className:"w-full border border-blue-500",children:[b.jsx("p",{children:"If this is your first login, the default credentials are:"}),b.jsxs("ul",{className:"mt-2",children:[b.jsxs("li",{children:["Username: ",b.jsx("strong",{children:"admin"})]}),b.jsxs("li",{children:["Password: ",b.jsx("strong",{children:"admin"})]})]}),b.jsx("p",{className:"mt-2",children:"Please make sure to change the default password to a secure one."})]}):b.jsx("button",{className:"button tertiary",onClick:()=>f(!0),children:"First login?"})]})})})},TM=()=>{const e=Tr(),{pathname:n}=Ln(),{data:i,isLoading:l}=Xv();E.useEffect(()=>{!i&&!l&&n!==pt.login.path&&e(pt.login.path)},[i,l,e,n])};function kM(){return Y_(),NR(),TM(),b.jsxs(b.Fragment,{children:[b.jsxs(IC,{children:[b.jsx(Lu,{path:pt.home.path,element:b.jsx(RT,{})}),b.jsx(Lu,{path:pt.workbench.path,element:b.jsx(aR,{})}),b.jsx(Lu,{path:pt.login.path,element:b.jsx(AM,{})})]}),b.jsx(sR,{}),b.jsx(IT,{}),b.jsx(ek,{}),b.jsx(hk,{}),b.jsx(xR,{}),b.jsx(_R,{}),b.jsx(dM,{}),b.jsx(yM,{}),b.jsx(EM,{}),b.jsx(ok,{}),b.jsx(rk,{})]})}const _M="_desktop-layout_w5s05_2",NM="_mobile-layout_w5s05_2",RM="_nav_w5s05_2",OM="_main_w5s05_2",jM="_footer_w5s05_2",Sa={desktopLayout:_M,mobileLayout:NM,nav:RM,main:OM,footer:jM},DM="_container_1220i_2",MM="_file_1220i_2",LM="_menu_1220i_2",pa={container:DM,file:MM,menu:LM},zM=({name:e,id:n,onRename:i,onDelete:l,onOpen:s})=>{const o=lx();return b.jsxs("button",{className:pa.file,onContextMenu:o.open,onClick:()=>s(n),children:[b.jsx(ox,{handler:o,children:b.jsxs("div",{className:"context-menu-container",children:[b.jsx("button",{onClick:c=>{c.preventDefault(),c.stopPropagation(),o.close(),i(n)},className:"context-menu-item",children:"✏️ Rename"}),b.jsx("button",{onClick:c=>{c.preventDefault(),c.stopPropagation(),o.close(),l(n)},className:"context-menu-item",children:"🗑️ Delete"})]})}),b.jsxs("span",{children:["📖 ",e]})]})},UM=({name:e,id:n,index:i})=>{const l=`📦 ${e}`,s=()=>{ba(n)};return Sr(i.toString(),()=>{ba(o=>{if(o!==n)return n})},l),b.jsxs("button",{className:pa.menu,onClick:s,children:[b.jsx("span",{className:"truncate",children:l}),b.jsx("span",{className:"hotkey",children:i})]})},BM=()=>{const e=Tc(w=>w.length>0),n=Tr(),i=Ln(),l=_p("Sidebar"),{data:s}=kr(),{data:o}=CA(s==null?void 0:s.teamId),c=I_(),f=w=>{tx(w).then(A=>{Xs(A.name,ga(A.opts),!0),i.pathname!==pt.workbench.path&&n(pt.workbench.path)})},d=async w=>{const A=o==null?void 0:o.find(k=>k.id===w),_=await Ui("New name?",A==null?void 0:A.name);_&&c.mutate({id:w,payload:{name:_}})},h=w=>{c.mutate({id:w,payload:{isTrash:!0}})},m=()=>{e?i.pathname!==pt.workbench.path&&n(pt.workbench.path):l()},g=()=>{Wh(),l()},x=()=>{Wh(),n(pt.home.path)};let v=1;return b.jsxs("div",{className:pa.container,children:[b.jsxs("div",{className:"mb-4",children:[b.jsxs("button",{onClick:x,className:pa.menu,children:[b.jsx("span",{children:pt.home.name}),b.jsx("span",{className:"hotkey",children:"H"})]}),b.jsxs("button",{disabled:!s,onClick:g,className:pa.menu,children:[b.jsx("span",{children:"🔎 Start new query"}),b.jsx("span",{className:"hotkey",children:"N"})]}),b.jsxs("button",{disabled:!s,onClick:m,className:pa.menu,children:[b.jsx("span",{children:"🛠️ Workbench"}),b.jsx("span",{className:"hotkey",children:"W"})]})]}),b.jsx("div",{className:"flex-1 overflow-y-auto",children:o==null?void 0:o.map(w=>{switch(w.type){case"query":return b.jsx(zM,{onDelete:h,onRename:d,onOpen:f,name:w.name,id:w.id},w.id);case"dataSource":return b.jsx(UM,{name:w.name,id:w.id,index:v++},w.id);default:return null}})})]})},qM=({resizeDirection:e,onSizeChange:n})=>{const i=E.useRef(null),l=E.useRef(null);return E.useEffect(()=>{var o;function s(c){const f=i.current.getBoundingClientRect(),d={x:c.pageX,y:c.pageY};function h(g){{let x;x=g.pageX-d.x,i.current.style.width=`${f.width+x}px`}n&&i.current&&n(i.current)}function m(){document.body.removeEventListener("mousemove",h),document.body.removeEventListener("mouseleave",h)}document.body.addEventListener("mousemove",h),document.body.addEventListener("mouseup",m),document.body.addEventListener("mouseleave",m)}(o=l==null?void 0:l.current)==null||o.addEventListener("mousedown",s),n&&i.current&&n(i.current)}),{elementRef:i,handleRef:l}},zw=()=>{const{elementRef:e,handleRef:n}=qM({resizeDirection:"horizontal-r"}),{data:i}=kr();return b.jsxs("nav",{className:Sa.nav,ref:e,children:[b.jsx("div",{ref:n,className:"hr-slide"}),b.jsx(BM,{}),i&&b.jsxs("div",{className:Sa.footer,children:[b.jsxs("button",{onClick:pM,children:["🪪 ",i.username]}),b.jsx("button",{onClick:bM,children:"👥 Manage users"})]})]})},HM=({children:e})=>b.jsxs("div",{className:Sa.desktopLayout,children:[b.jsx(Nx,{id:"default",className:"z-100"}),b.jsx(zw,{}),b.jsx("main",{className:Sa.main,children:e})]}),FM=({children:e})=>{const n=rR(),i=()=>qp(!1);return b.jsxs("div",{className:Sa.mobileLayout,children:[b.jsx(px,{isVisible:n,onClose:i,backdropClose:!0,contentClassName:"flex",children:b.jsx(zw,{})}),b.jsx("main",{className:Sa.main,children:e})]})},PM=({children:e})=>Rc(uo.laptop)?b.jsx(HM,{children:e}):b.jsx(FM,{children:e});J2.createRoot(document.getElementById("root")).render(b.jsxs(nt.StrictMode,{children:[b.jsx(xA,{}),b.jsx(KE,{client:xt,children:b.jsx(pE,{children:b.jsx(PM,{children:b.jsx(kM,{})})})})]}));
284
+ `,dM=()=>{const{data:e,refetch:n}=DR();return!(e!=null&&e.active)||MR(e.version,"0.0.64")===0?null:b.jsx(tn,{isVisible:!0,onClose:()=>null,children:b.jsxs("div",{children:[b.jsx(cM,{content:fM}),b.jsx("div",{className:"flex justify-end mt-2",children:b.jsx("button",{className:"button primary",onClick:()=>n(),children:"Check again"})})]})})},[hM,Mw]=zn(!1),Nh=()=>Mw(!1),pM=()=>Mw(!0),mM=({repeatPassword:e,password:n})=>n.length<1?null:n.length<8?b.jsx(gn,{variant:"warning",children:"New password should be at least 8 characters long"}):n!==e?b.jsx(gn,{variant:"warning",children:"Repeat password should match new password"}):null,yM=()=>{const e=hM(),{data:n}=kr(),{mutateAsync:i,isLoading:l}=jA(),s=Tr(),[{password:o,repeatPassword:c},{change:f,touched:d,reset:h}]=oo({password:"",repeatPassword:""}),m=()=>{s("/"),ao.logout().then(()=>{Nh()})},g=()=>{i({password:o}).then(()=>{h(),un.success("Password successfully updated!")})},x=o.length<8||o!==c||l,v=d.includes("password");return b.jsxs(tn,{isVisible:e,onClose:Nh,children:[b.jsx(er,{onClick:Nh}),b.jsxs("div",{className:"w-full lg:w-lg flex flex-col gap-2",children:[b.jsx(nx,{children:"Account settings"}),b.jsxs("label",{children:[b.jsx("p",{className:"text-xs font-semibold mb-1",children:"Username"}),b.jsx("input",{className:"input w-full",readOnly:!0,disabled:!0,value:n==null?void 0:n.username})]}),b.jsxs("div",{className:"grid grid-cols-2 gap-2",children:[b.jsxs("label",{children:[b.jsx("p",{className:"text-xs font-semibold mb-1",children:"Change password"}),b.jsx("input",{className:"input w-full",type:"password",name:"newPassword",autoComplete:"new-password",value:o,onChange:f("password")})]}),b.jsxs("label",{children:[b.jsx("p",{className:"text-xs font-semibold mb-1",children:"Repeat password"}),b.jsx("input",{className:"input w-full",type:"password",value:c,onChange:f("repeatPassword")})]})]}),v&&b.jsx(mM,{password:o,repeatPassword:c}),b.jsxs("div",{className:"flex justify-end gap-2 mt-2",children:[b.jsx("button",{className:"button tertiary",disabled:x,onClick:g,children:"Update password"}),b.jsx("button",{className:"button danger",onClick:m,children:"Log out"})]})]})]})},[gM,Lw]=zn(!1),bM=()=>Lw(!0),Qb=()=>Lw(!1),vM=e=>Wn({queryKey:["team-users"],queryFn:async()=>{const{data:n}=await at.get("/teams/"+e+"/users");return n.data},enabled:!!e}),xM=()=>Jn({mutationFn:async({role:e,teamId:n,userId:i})=>(await at.patch("/teams/"+n+"/user-role",{role:e,userId:i}),!0),onSuccess:()=>{xt.invalidateQueries({queryKey:["team-users"]})}}),wM=()=>Jn({mutationFn:async({teamId:e,userId:n})=>(await at.delete("/teams/"+e,{params:{userId:n}}),!0),onSuccess:()=>{xt.invalidateQueries({queryKey:["team-users"]})}}),SM="_user-entry_n81ze_2",CM={userEntry:SM},EM=()=>{const e=gM(),{data:n}=kr(),{data:i}=vM(n==null?void 0:n.teamId),{mutate:l,isLoading:s}=DA(),{mutate:o,isLoading:c}=xM(),{mutate:f,isLoading:d}=wM(),[h,{change:m,reset:g}]=oo({password:"",username:""}),x=()=>{l({username:h.username,password:h.password,teamId:(n==null?void 0:n.teamId)||""}),g()},v=(k,O)=>{o({teamId:n.teamId,role:O,userId:k})},w=k=>{rx("Are you sure you want to remove this user?").then(O=>{O&&f({userId:k,teamId:n.teamId})})},A=Da(sn.ADMIN),_=s||c||d;return b.jsxs(tn,{isVisible:e,onClose:Qb,backdropClose:!0,children:[b.jsx(er,{onClick:Qb}),b.jsxs("div",{className:"w-full lg:w-lg flex flex-col overflow-hidden",children:[b.jsx(nx,{children:"Manage users"}),Nc(i==null?void 0:i.length,0)&&b.jsx("div",{className:"mt-4 overflow-y-auto flex-1",children:i.map(k=>b.jsxs("div",{className:CM.userEntry,children:[b.jsxs("select",{className:"input",value:k.role,disabled:!A||_,onChange:O=>v(k.id,O.currentTarget.value),children:[b.jsx("option",{value:sn.OWNER,children:"Owner"}),b.jsx("option",{value:sn.ADMIN,children:"Admin"}),b.jsx("option",{value:sn.EDITOR,children:"Editor"}),b.jsx("option",{value:sn.READ_ONLY,children:"Reader"})]}),b.jsx("p",{className:"flex-1 mx-2",children:k.name}),A&&b.jsx("button",{className:"p-1 cursor-pointer text-red-500 text-sm",onClick:()=>w(k.id),children:"❌"})]},k.id))}),A&&b.jsxs("div",{className:"mt-4",children:[b.jsx("p",{className:"font-semibold",children:"Create new user"}),b.jsxs("div",{className:"flex flex-col lg:flex-row gap-2 lg:items-center mt-2",children:[b.jsx("input",{className:"input flex-1",onChange:m("username"),value:h.username,placeholder:"Username",disabled:_}),b.jsx("input",{className:"input",onChange:m("password"),value:h.password,type:"password",name:"newPassword",autoComplete:"new-password",placeholder:"Password",disabled:_}),b.jsx("button",{className:"button primary",onClick:x,disabled:_,children:"Create user"})]}),b.jsx("p",{className:"text-xs mt-1 text-gray-600",children:"You should create default password for the new account. The user should change it after the first login."})]})]})]})},AM=()=>{const[e,n]=E.useState(""),[i,l]=E.useState(""),[s,o]=E.useState(),[c,f]=E.useState(!1),d=Tr(),h=m=>{m.preventDefault(),o(void 0),ao.login({password:i,username:e}).then(()=>{d("/",{replace:!0})}).catch(o)};return b.jsx("div",{className:"page-container bg-(--bg) h-screen",children:b.jsx("div",{className:"page-content items-center",children:b.jsxs("form",{className:"flex flex-col gap-2 w-full lg:w-lg",onSubmit:h,children:[b.jsx("p",{className:"font-semibold text-xl min-w-md",children:"Login"}),s&&b.jsx(gn,{variant:"danger",children:"Failed to login. Please verify your credentials"}),b.jsx("input",{value:e,onChange:m=>n(m.currentTarget.value),className:"input",placeholder:"User name"}),b.jsx("input",{value:i,onChange:m=>l(m.currentTarget.value),className:"input",type:"password",placeholder:"Password"}),b.jsx("button",{type:"submit",className:"button primary",children:"Login"}),c?b.jsxs(gn,{className:"w-full border border-blue-500",children:[b.jsx("p",{children:"If this is your first login, the default credentials are:"}),b.jsxs("ul",{className:"mt-2",children:[b.jsxs("li",{children:["Username: ",b.jsx("strong",{children:"admin"})]}),b.jsxs("li",{children:["Password: ",b.jsx("strong",{children:"admin"})]})]}),b.jsx("p",{className:"mt-2",children:"Please make sure to change the default password to a secure one."})]}):b.jsx("button",{className:"button tertiary",onClick:()=>f(!0),children:"First login?"})]})})})},TM=()=>{const e=Tr(),{pathname:n}=Ln(),{data:i,isLoading:l}=Xv();E.useEffect(()=>{!i&&!l&&n!==pt.login.path&&e(pt.login.path)},[i,l,e,n])};function kM(){return Y_(),NR(),TM(),b.jsxs(b.Fragment,{children:[b.jsxs(IC,{children:[b.jsx(Lu,{path:pt.home.path,element:b.jsx(RT,{})}),b.jsx(Lu,{path:pt.workbench.path,element:b.jsx(aR,{})}),b.jsx(Lu,{path:pt.login.path,element:b.jsx(AM,{})})]}),b.jsx(sR,{}),b.jsx(IT,{}),b.jsx(ek,{}),b.jsx(hk,{}),b.jsx(xR,{}),b.jsx(_R,{}),b.jsx(dM,{}),b.jsx(yM,{}),b.jsx(EM,{}),b.jsx(ok,{}),b.jsx(rk,{})]})}const _M="_desktop-layout_w5s05_2",NM="_mobile-layout_w5s05_2",RM="_nav_w5s05_2",OM="_main_w5s05_2",jM="_footer_w5s05_2",Sa={desktopLayout:_M,mobileLayout:NM,nav:RM,main:OM,footer:jM},DM="_container_1220i_2",MM="_file_1220i_2",LM="_menu_1220i_2",pa={container:DM,file:MM,menu:LM},zM=({name:e,id:n,onRename:i,onDelete:l,onOpen:s})=>{const o=lx();return b.jsxs("button",{className:pa.file,onContextMenu:o.open,onClick:()=>s(n),children:[b.jsx(ox,{handler:o,children:b.jsxs("div",{className:"context-menu-container",children:[b.jsx("button",{onClick:c=>{c.preventDefault(),c.stopPropagation(),o.close(),i(n)},className:"context-menu-item",children:"✏️ Rename"}),b.jsx("button",{onClick:c=>{c.preventDefault(),c.stopPropagation(),o.close(),l(n)},className:"context-menu-item",children:"🗑️ Delete"})]})}),b.jsxs("span",{children:["📖 ",e]})]})},UM=({name:e,id:n,index:i})=>{const l=`📦 ${e}`,s=()=>{ba(n)};return Sr(i.toString(),()=>{ba(o=>{if(o!==n)return n})},l),b.jsxs("button",{className:pa.menu,onClick:s,children:[b.jsx("span",{className:"truncate",children:l}),b.jsx("span",{className:"hotkey",children:i})]})},BM=()=>{const e=Tc(w=>w.length>0),n=Tr(),i=Ln(),l=_p("Sidebar"),{data:s}=kr(),{data:o}=CA(s==null?void 0:s.teamId),c=I_(),f=w=>{tx(w).then(A=>{Xs(A.name,ga(A.opts),!0),i.pathname!==pt.workbench.path&&n(pt.workbench.path)})},d=async w=>{const A=o==null?void 0:o.find(k=>k.id===w),_=await Ui("New name?",A==null?void 0:A.name);_&&c.mutate({id:w,payload:{name:_}})},h=w=>{c.mutate({id:w,payload:{isTrash:!0}})},m=()=>{e?i.pathname!==pt.workbench.path&&n(pt.workbench.path):l()},g=()=>{Wh(),l()},x=()=>{Wh(),n(pt.home.path)};let v=1;return b.jsxs("div",{className:pa.container,children:[b.jsxs("div",{className:"mb-4",children:[b.jsxs("button",{onClick:x,className:pa.menu,children:[b.jsx("span",{children:pt.home.name}),b.jsx("span",{className:"hotkey",children:"H"})]}),b.jsxs("button",{disabled:!s,onClick:g,className:pa.menu,children:[b.jsx("span",{children:"🔎 Start new query"}),b.jsx("span",{className:"hotkey",children:"N"})]}),b.jsxs("button",{disabled:!s,onClick:m,className:pa.menu,children:[b.jsx("span",{children:"🛠️ Workbench"}),b.jsx("span",{className:"hotkey",children:"W"})]})]}),b.jsx("div",{className:"flex-1 overflow-y-auto",children:o==null?void 0:o.map(w=>{switch(w.type){case"query":return b.jsx(zM,{onDelete:h,onRename:d,onOpen:f,name:w.name,id:w.id},w.id);case"dataSource":return b.jsx(UM,{name:w.name,id:w.id,index:v++},w.id);default:return null}})})]})},qM=({resizeDirection:e,onSizeChange:n})=>{const i=E.useRef(null),l=E.useRef(null);return E.useEffect(()=>{var o;function s(c){const f=i.current.getBoundingClientRect(),d={x:c.pageX,y:c.pageY};function h(g){{let x;x=g.pageX-d.x,i.current.style.width=`${f.width+x}px`}n&&i.current&&n(i.current)}function m(){document.body.removeEventListener("mousemove",h),document.body.removeEventListener("mouseleave",h)}document.body.addEventListener("mousemove",h),document.body.addEventListener("mouseup",m),document.body.addEventListener("mouseleave",m)}(o=l==null?void 0:l.current)==null||o.addEventListener("mousedown",s),n&&i.current&&n(i.current)}),{elementRef:i,handleRef:l}},zw=()=>{const{elementRef:e,handleRef:n}=qM({resizeDirection:"horizontal-r"}),{data:i}=kr();return b.jsxs("nav",{className:Sa.nav,ref:e,children:[b.jsx("div",{ref:n,className:"hr-slide"}),b.jsx(BM,{}),i&&b.jsxs("div",{className:Sa.footer,children:[b.jsxs("button",{onClick:pM,children:["🪪 ",i.username]}),b.jsx("button",{onClick:bM,children:"👥 Manage users"})]})]})},HM=({children:e})=>b.jsxs("div",{className:Sa.desktopLayout,children:[b.jsx(Nx,{id:"default",className:"z-100"}),b.jsx(zw,{}),b.jsx("main",{className:Sa.main,children:e})]}),FM=({children:e})=>{const n=rR(),i=()=>qp(!1);return b.jsxs("div",{className:Sa.mobileLayout,children:[b.jsx(px,{isVisible:n,onClose:i,backdropClose:!0,contentClassName:"flex",children:b.jsx(zw,{})}),b.jsx("main",{className:Sa.main,children:e})]})},PM=({children:e})=>Rc(uo.laptop)?b.jsx(HM,{children:e}):b.jsx(FM,{children:e});J2.createRoot(document.getElementById("root")).render(b.jsxs(nt.StrictMode,{children:[b.jsx(xA,{}),b.jsx(KE,{client:xt,children:b.jsx(pE,{children:b.jsx(PM,{children:b.jsx(kM,{})})})})]}));
@@ -7,7 +7,7 @@
7
7
  <title>DataRamen | Lightweight GUI for MySQL & PostgreSQL</title>
8
8
  <meta name="description" content="Designed for speed, DataRamen makes navigating MySQL and PostgreSQL data effortless with a clean, high-performance interface." />
9
9
  <meta name="robots" content="noindex, nofollow">
10
- <script type="module" crossorigin src="/assets/index-ZTWDPyqE.js"></script>
10
+ <script type="module" crossorigin src="/assets/index-CfYl5Huu.js"></script>
11
11
  <link rel="stylesheet" crossorigin href="/assets/index-DcFOqbgf.css">
12
12
  </head>
13
13
  <body>
package/dist/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@dataramen/server","version":"0.0.63","license":"MIT","main":"code/server.js","dependencies":{"@fastify/cors":"^11.0.1","@fastify/static":"^8.2.0","@fastify/cookie":"^11.0.2","dotenv":"^16.5.0","fast-glob":"^3.3.3","fastify":"^5.3.2","mysql2":"^3.14.1","pg":"^8.15.6","sqlite3":"^5.1.7","typeorm":"^0.3.23","bcryptjs":"^3.0.2","jose":"^6.0.12","reflect-metadata":"^0.2.2"},"devDependencies":{"fs-extra":"^11.3.0","open":"^10.2.0","yargs":"^18.0.0","yocto-spinner":"^1.0.0"}}
1
+ {"name":"@dataramen/server","version":"0.0.64","license":"MIT","main":"code/server.js","dependencies":{"@fastify/cors":"^11.0.1","@fastify/static":"^8.2.0","@fastify/cookie":"^11.0.2","dotenv":"^16.5.0","fast-glob":"^3.3.3","fastify":"^5.3.2","mysql2":"^3.14.1","pg":"^8.15.6","sqlite3":"^5.1.7","typeorm":"^0.3.23","bcryptjs":"^3.0.2","jose":"^6.0.12","reflect-metadata":"^0.2.2"},"devDependencies":{"fs-extra":"^11.3.0","open":"^10.2.0","yargs":"^18.0.0","yocto-spinner":"^1.0.0"}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dataramen/cli",
3
- "version": "0.0.40",
3
+ "version": "0.0.41",
4
4
  "license": "MIT",
5
5
  "bin": {
6
6
  "dataramen": "bin/run.js"
@@ -16,6 +16,7 @@
16
16
  },
17
17
  "devDependencies": {
18
18
  "@types/fs-extra": "^11.0.3",
19
+ "@types/yargs": "^17.0.33",
19
20
  "esbuild": "^0.25.5"
20
21
  },
21
22
  "files": [
@@ -1,7 +0,0 @@
1
- PORT=4466
2
-
3
- APP_DB_TYPE=sqlite
4
- APP_DB_DATABASE=<home>/.dataramen/.runtime/db.sqlite3
5
- APP_DB_SYNCHRONIZE=true
6
-
7
- PROD=true