@dataramen/cli 0.0.20 → 0.0.22

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/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # 🍜 DataRamen CLI
2
2
 
3
- Your cozy corner for exploring and working with SQL databases no query writing required (unless you want to).
3
+ Your cozy corner for exploring and working with SQL databases - no query writing required.
4
4
 
5
- DataRamen CLI lets you launch a powerful, local database exploration app that connects effortlessly to MySQL and PostgreSQL databases. Browse schemas, follow relationships, insert data, and even write raw SQL — all from your browser.
5
+ DataRamen CLI lets you launch a powerful, local database exploration app that connects effortlessly to MySQL and PostgreSQL databases. Browse schemas, follow relationships, and insert/update data - all from your browser.
6
6
 
7
7
  ## ✨ Features
8
8
 
9
9
  - 🔌 **Connect to PostgreSQL & MySQL**
10
- Securely plug in your credentials you're ready to explore.
10
+ Securely plug in your credentials - you're ready to explore.
11
11
 
12
12
  - 🧭 **Visual Schema Explorer**
13
13
  Instantly browse tables, columns, types, primary/foreign keys, and relationships.
@@ -16,17 +16,14 @@ DataRamen CLI lets you launch a powerful, local database exploration app that co
16
16
  Filter, sort, join, and summarize data using a beautiful, intuitive interface.
17
17
 
18
18
  - 🔗 **Follow Relationships Easily**
19
- Click to expand related records like nested tables.
19
+ Click to expand related records.
20
20
 
21
21
  - ✏️ **Insert & Update Visually**
22
- Add or modify rows with a visual editor no SQL errors.
22
+ Add or modify rows with a visual editor - no SQL errors.
23
23
 
24
24
  - 💾 **Save Queries**
25
25
  Save your favorite views for quick access later.
26
26
 
27
- - ⌨️ **Raw SQL Mode Available**
28
- Prefer typing? Drop into SQL mode anytime and run your own queries.
29
-
30
27
  ## 🛠️ Installation
31
28
 
32
29
  ### 1. Install Node.js
@@ -56,11 +53,12 @@ Go to https://app.dataramen.xyz in your browser. Your local server will connect
56
53
 
57
54
  ## 🔧 Additional CLI Commands
58
55
 
59
- | Command | Description |
60
- | ----------------- |------------------------------------|
61
- | `dataramen start` | Start the local DataRamen server |
62
- | `dataramen stop` | Stop the local server |
63
- | `dataramen logs` | Show logs from the running server |
56
+ | Command | Description |
57
+ |-------------------|----------------------------------|
58
+ | `dataramen start` | Start the local DataRamen server |
59
+ | `dataramen stop` | Stop the local server |
60
+ | `dataramen open` | Open local webapp |
61
+ | `dataramen logs` | Show logs from the running server|
64
62
 
65
63
  ## ❤️ Made with love by [Oleksandr Demian](https://github.com/OleksandrDemian)
66
64
 
package/bin/run.js CHANGED
@@ -1,2 +1,3 @@
1
1
  #!/usr/bin/env node
2
- var J=Object.create;var P=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var N=(r,t,o,p)=>{if(t&&typeof t=="object"||typeof t=="function")for(let m of B(t))!H.call(r,m)&&m!==o&&P(r,m,{get:()=>t[m],enumerable:!(p=T(t,m))||p.enumerable});return r};var a=(r,t,o)=>(o=r!=null?J(D(r)):{},N(t||!r||!r.__esModule?P(o,"default",{value:r,enumerable:!0}):o,r));var F=a(require("yargs")),I=require("yargs/helpers");var v=require("node:os"),y=require("node:path"),V=(0,v.homedir)();var e="@dataramen/local-server",n=(0,y.join)(V,".dataramen",".runtime","server");var O=require("node:path"),L=a(require("fs-extra")),$=require("node:child_process");var x=a(require("fs-extra")),u=require("node:path");function S(r){let t;function o(){try{return t||(t=x.readJsonSync(r)),t}catch{return}}return o}var h=S((0,u.join)(__dirname,"..","package.json")),d=S((0,u.join)(n,"package.json"));var c=a(require("fs-extra")),s=require("node:path"),w=require("node:child_process"),E=require("node:util"),l=a(require("yocto-spinner")),i=(0,E.promisify)(w.exec);function _(){try{let r=d();if(!r)return!0;let t=c.readJsonSync((0,s.join)(__dirname,"..","dist","package.json"));return r.version!==t.version}catch{return!0}}async function k(){let r=(0,l.default)({text:"Checking if PM2 is installed"}).start();try{return await i("pm2 -v"),r.success("PM2 already installed"),!0}catch{return r.warning("PM2 not installed"),!1}}async function R(){let r=(0,l.default)({text:"Installing PM2"}).start();try{await i("npm i -g pm2"),r.success("Installed PM2")}catch{r.error("Failed to install PM2"),process.exit(1)}}async function j(){let r=(0,l.default)({text:"Stop running instances of "+e}).start();try{await i(`pm2 stop "${e}"`),r.warning("Stopped "+e)}catch{r.success("No running instances of "+e+" found")}}async function A(){let r=(0,l.default)({text:"Create local server"}).start();c.copySync((0,s.join)(__dirname,"..","dist","code"),(0,s.join)(n,"code")),c.copySync((0,s.join)(__dirname,"..","dist","env",".env.default"),(0,s.join)(n,"env",".env.default")),c.copySync((0,s.join)(__dirname,"..","dist","package.json"),(0,s.join)(n,"package.json")),r.text="Install local server dependencies",await i("npm i",{cwd:n}),r.success("Local server installed")}var g=a(require("yocto-spinner")),b=a(require("open"));var C=require("node:net");async function M(r){return new Promise(t=>{let o=(0,C.createServer)().once("error",()=>{t(!1)}).once("listening",()=>{o.close()}).once("close",()=>t(!0)).listen(r,"0.0.0.0")})}async function z(){await k()||await R(),await j();try{if(_()&&await A(),!await M(4466))throw new Error("Port 4466 is occupied by another process");let o=(0,g.default)({text:"Starting new instance of "+e}).start(),p=L.readJsonSync((0,O.join)(n,"package.json"));await i(`pm2 start "${p.main}" --name "${e}" --no-autorestart`,{cwd:n}),o.success("Local server will be available in a couple of seconds"),console.log("You can close this window"),await(0,b.default)("https://app.dataramen.xyz"),console.log("App is running at https://app.dataramen.xyz")}catch(t){console.error("Failed to start local server",t)}}async function W(){(0,$.execSync)(`pm2 logs ${e}`,{stdio:"inherit"})}async function Y(){let r=(0,g.default)({text:"Stopping local server"}).start();await i(`pm2 stop ${e}`),r.success("Local server stopped")}function q(){console.log(`Dataramen CLI version: ${h().version}`),console.log(`Dataramen local server version: ${d().version}`)}var f={start:z,logs:W,stop:Y,version:q};(0,F.default)((0,I.hideBin)(process.argv)).command("start","Default command, start/restart the server",f.start).command(["logs"],"Listen for logs",f.logs).command("stop","Stop the server",f.stop).command(["version"],"Show version",f.version).parse();
2
+ var D=Object.create;var x=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var Y=Object.getPrototypeOf,G=Object.prototype.hasOwnProperty;var K=(n,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of z(t))!G.call(n,s)&&s!==e&&x(n,s,{get:()=>t[s],enumerable:!(o=q(t,s))||o.enumerable});return n};var m=(n,t,e)=>(e=n!=null?D(Y(n)):{},K(t||!n||!n.__esModule?x(e,"default",{value:n,enumerable:!0}):e,n));var B=m(require("yargs")),J=require("yargs/helpers");var S=require("node:os"),E=require("node:path"),Q=(0,S.homedir)();var i="@dataramen/local-server",r=(0,E.join)(Q,".dataramen",".runtime","server");var W=require("node:path"),L=m(require("fs-extra")),V=require("node:child_process");var R=m(require("fs-extra")),h=require("node:path");function _(n){let t;function e(){try{return t||(t=R.readJsonSync(n)),t}catch{return}}return e}var k=_((0,h.join)(__dirname,"..","package.json")),g=_((0,h.join)(r,"package.json"));var p=m(require("fs-extra")),a=require("node:path"),b=require("node:child_process"),A=require("node:util"),d=m(require("yocto-spinner")),f=(0,A.promisify)(b.exec);function O(){try{let n=g();if(!n)return!0;let t=p.readJsonSync((0,a.join)(__dirname,"..","dist","package.json"));return n.version!==t.version}catch{return!0}}async function j(){let n=(0,d.default)({text:"Checking if PM2 is installed"}).start();try{return await f("pm2 -v"),n.success("PM2 already installed"),!0}catch{return n.warning("PM2 not installed"),!1}}async function C(){let n=(0,d.default)({text:"Installing PM2"}).start();try{await f("npm i -g pm2"),n.success("Installed PM2")}catch{n.error("Failed to install PM2"),process.exit(1)}}async function y(){let n=(0,d.default)({text:"Stop running instances of "+i}).start();try{await f(`pm2 stop "${i}"`),n.warning("Stopped "+i)}catch{n.success("No running instances of "+i+" found")}}async function N(){let n=(0,d.default)({text:"Create local server"}).start();p.copySync((0,a.join)(__dirname,"..","dist","code"),(0,a.join)(r,"code")),p.copySync((0,a.join)(__dirname,"..","dist","env",".env.default"),(0,a.join)(r,"env",".env.default")),p.copySync((0,a.join)(__dirname,"..","dist","package.json"),(0,a.join)(r,"package.json")),n.text="Install local server dependencies",await f("npm i",{cwd:r}),n.success("Local server installed")}var I=m(require("yocto-spinner")),w=m(require("open"));var F=require("node:net");async function T(n){return new Promise(t=>{let e=(0,F.createServer)().once("error",()=>{t(!1)}).once("listening",()=>{e.close()}).once("close",()=>t(!0)).listen(n,"0.0.0.0")})}var $=require("fs-extra");var M=require("node:path");function U(...n){let t={};for(let e of n){let o=e.split(`
3
+ `);for(let s of o){let u=s.trim();if(!u||u.startsWith("#"))continue;let v=u.indexOf("=");if(v===-1)continue;let H=u.slice(0,v).trim(),c=u.slice(v+1).trim();(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),t[H]=c}}return{getNumber:e=>nn(t[e]),getString:e=>tn(t[e]),getBoolean:e=>en(t[e])}}function X(n){let t=[];for(let e of n){let o=Z(e);o&&t.push(o)}return U(...t)}var P=X([".env.default",".env"]);function Z(n){try{return(0,$.readFileSync)((0,M.join)(r,"env",n),"utf-8")}catch{return}}function nn(n){if(!n)return;let t=Number(n);if(!isNaN(t)&&n.trim()!=="")return t;throw new Error("Wrong env value type")}function tn(n){if(n){if(typeof n=="string")return n;throw new Error("Wrong env value type")}}function en(n){if(!n)return;let t=n.toLowerCase();if(t==="true")return!0;if(t==="false")return!1;throw new Error("Wrong env value type")}async function rn(){await j()||await C(),await y();try{O()&&await N();let t=P.getNumber("PORT");if(!t)throw new Error("PORT env variable not found");if(!await T(t))throw new Error(`Port ${t} is occupied by another process`);let o=(0,I.default)({text:"Starting new instance of "+i}).start(),s=L.readJsonSync((0,W.join)(r,"package.json"));await f(`pm2 start "${s.main}" --name "${i}" --no-autorestart`,{cwd:r}),o.success("Local server will be available in a couple of seconds"),console.log("You can close this window"),await(0,w.default)(`http://localhost:${t}`),console.log(`App is running at http://localhost:${t} and https://app.dataramen.xyz`)}catch(t){console.error("Failed to start local server",t)}}async function on(){(0,V.execSync)(`pm2 logs ${i}`,{stdio:"inherit"})}async function sn(){await y()}function an(){console.log(`DataRamen CLI version: ${k().version}`),console.log(`DataRamen local server version: ${g().version}`)}async function cn(){let n=P.getNumber("PORT");await(0,w.default)(`http://localhost:${n}`)}var l={start:rn,logs:on,stop:sn,version:an,open:cn};(0,B.default)((0,J.hideBin)(process.argv)).command("start","Default command, start/restart the server",l.start).command(["logs"],"Listen for logs",l.logs).command("stop","Stop the server",l.stop).command("open","Stop the server",l.open).command(["version"],"Show version",l.version).parse();
package/dist/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # 🍜 DataRamen CLI
2
2
 
3
- Your cozy corner for exploring and working with SQL databases no query writing required (unless you want to).
3
+ Your cozy corner for exploring and working with SQL databases - no query writing required.
4
4
 
5
- DataRamen CLI lets you launch a powerful, local database exploration app that connects effortlessly to MySQL and PostgreSQL databases. Browse schemas, follow relationships, insert data, and even write raw SQL — all from your browser.
5
+ DataRamen CLI lets you launch a powerful, local database exploration app that connects effortlessly to MySQL and PostgreSQL databases. Browse schemas, follow relationships, and insert/update data - all from your browser.
6
6
 
7
7
  ## ✨ Features
8
8
 
9
9
  - 🔌 **Connect to PostgreSQL & MySQL**
10
- Securely plug in your credentials you're ready to explore.
10
+ Securely plug in your credentials - you're ready to explore.
11
11
 
12
12
  - 🧭 **Visual Schema Explorer**
13
13
  Instantly browse tables, columns, types, primary/foreign keys, and relationships.
@@ -16,17 +16,14 @@ DataRamen CLI lets you launch a powerful, local database exploration app that co
16
16
  Filter, sort, join, and summarize data using a beautiful, intuitive interface.
17
17
 
18
18
  - 🔗 **Follow Relationships Easily**
19
- Click to expand related records like nested tables.
19
+ Click to expand related records.
20
20
 
21
21
  - ✏️ **Insert & Update Visually**
22
- Add or modify rows with a visual editor no SQL errors.
22
+ Add or modify rows with a visual editor - no SQL errors.
23
23
 
24
24
  - 💾 **Save Queries**
25
25
  Save your favorite views for quick access later.
26
26
 
27
- - ⌨️ **Raw SQL Mode Available**
28
- Prefer typing? Drop into SQL mode anytime and run your own queries.
29
-
30
27
  ## 🛠️ Installation
31
28
 
32
29
  ### 1. Install Node.js
@@ -56,11 +53,12 @@ Go to https://app.dataramen.xyz in your browser. Your local server will connect
56
53
 
57
54
  ## 🔧 Additional CLI Commands
58
55
 
59
- | Command | Description |
60
- | ----------------- |------------------------------------|
61
- | `dataramen start` | Start the local DataRamen server |
62
- | `dataramen stop` | Stop the local server |
63
- | `dataramen logs` | Show logs from the running server |
56
+ | Command | Description |
57
+ |-------------------|----------------------------------|
58
+ | `dataramen start` | Start the local DataRamen server |
59
+ | `dataramen stop` | Stop the local server |
60
+ | `dataramen open` | Open local webapp |
61
+ | `dataramen logs` | Show logs from the running server|
64
62
 
65
63
  ## ❤️ Made with love by [Oleksandr Demian](https://github.com/OleksandrDemian)
66
64
 
package/dist/code/cli.js CHANGED
@@ -1,2 +1,3 @@
1
1
  #!/usr/bin/env node
2
- var J=Object.create;var P=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var N=(r,t,o,p)=>{if(t&&typeof t=="object"||typeof t=="function")for(let m of B(t))!H.call(r,m)&&m!==o&&P(r,m,{get:()=>t[m],enumerable:!(p=T(t,m))||p.enumerable});return r};var a=(r,t,o)=>(o=r!=null?J(D(r)):{},N(t||!r||!r.__esModule?P(o,"default",{value:r,enumerable:!0}):o,r));var F=a(require("yargs")),I=require("yargs/helpers");var v=require("node:os"),y=require("node:path"),V=(0,v.homedir)();var e="@dataramen/local-server",n=(0,y.join)(V,".dataramen",".runtime","server");var O=require("node:path"),L=a(require("fs-extra")),$=require("node:child_process");var x=a(require("fs-extra")),u=require("node:path");function S(r){let t;function o(){try{return t||(t=x.readJsonSync(r)),t}catch{return}}return o}var h=S((0,u.join)(__dirname,"..","package.json")),d=S((0,u.join)(n,"package.json"));var c=a(require("fs-extra")),s=require("node:path"),w=require("node:child_process"),E=require("node:util"),l=a(require("yocto-spinner")),i=(0,E.promisify)(w.exec);function _(){try{let r=d();if(!r)return!0;let t=c.readJsonSync((0,s.join)(__dirname,"..","dist","package.json"));return r.version!==t.version}catch{return!0}}async function k(){let r=(0,l.default)({text:"Checking if PM2 is installed"}).start();try{return await i("pm2 -v"),r.success("PM2 already installed"),!0}catch{return r.warning("PM2 not installed"),!1}}async function R(){let r=(0,l.default)({text:"Installing PM2"}).start();try{await i("npm i -g pm2"),r.success("Installed PM2")}catch{r.error("Failed to install PM2"),process.exit(1)}}async function j(){let r=(0,l.default)({text:"Stop running instances of "+e}).start();try{await i(`pm2 stop "${e}"`),r.warning("Stopped "+e)}catch{r.success("No running instances of "+e+" found")}}async function A(){let r=(0,l.default)({text:"Create local server"}).start();c.copySync((0,s.join)(__dirname,"..","dist","code"),(0,s.join)(n,"code")),c.copySync((0,s.join)(__dirname,"..","dist","env",".env.default"),(0,s.join)(n,"env",".env.default")),c.copySync((0,s.join)(__dirname,"..","dist","package.json"),(0,s.join)(n,"package.json")),r.text="Install local server dependencies",await i("npm i",{cwd:n}),r.success("Local server installed")}var g=a(require("yocto-spinner")),b=a(require("open"));var C=require("node:net");async function M(r){return new Promise(t=>{let o=(0,C.createServer)().once("error",()=>{t(!1)}).once("listening",()=>{o.close()}).once("close",()=>t(!0)).listen(r,"0.0.0.0")})}async function z(){await k()||await R(),await j();try{if(_()&&await A(),!await M(4466))throw new Error("Port 4466 is occupied by another process");let o=(0,g.default)({text:"Starting new instance of "+e}).start(),p=L.readJsonSync((0,O.join)(n,"package.json"));await i(`pm2 start "${p.main}" --name "${e}" --no-autorestart`,{cwd:n}),o.success("Local server will be available in a couple of seconds"),console.log("You can close this window"),await(0,b.default)("https://app.dataramen.xyz"),console.log("App is running at https://app.dataramen.xyz")}catch(t){console.error("Failed to start local server",t)}}async function W(){(0,$.execSync)(`pm2 logs ${e}`,{stdio:"inherit"})}async function Y(){let r=(0,g.default)({text:"Stopping local server"}).start();await i(`pm2 stop ${e}`),r.success("Local server stopped")}function q(){console.log(`Dataramen CLI version: ${h().version}`),console.log(`Dataramen local server version: ${d().version}`)}var f={start:z,logs:W,stop:Y,version:q};(0,F.default)((0,I.hideBin)(process.argv)).command("start","Default command, start/restart the server",f.start).command(["logs"],"Listen for logs",f.logs).command("stop","Stop the server",f.stop).command(["version"],"Show version",f.version).parse();
2
+ var D=Object.create;var x=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var z=Object.getOwnPropertyNames;var Y=Object.getPrototypeOf,G=Object.prototype.hasOwnProperty;var K=(n,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of z(t))!G.call(n,s)&&s!==e&&x(n,s,{get:()=>t[s],enumerable:!(o=q(t,s))||o.enumerable});return n};var m=(n,t,e)=>(e=n!=null?D(Y(n)):{},K(t||!n||!n.__esModule?x(e,"default",{value:n,enumerable:!0}):e,n));var B=m(require("yargs")),J=require("yargs/helpers");var S=require("node:os"),E=require("node:path"),Q=(0,S.homedir)();var i="@dataramen/local-server",r=(0,E.join)(Q,".dataramen",".runtime","server");var W=require("node:path"),L=m(require("fs-extra")),V=require("node:child_process");var R=m(require("fs-extra")),h=require("node:path");function _(n){let t;function e(){try{return t||(t=R.readJsonSync(n)),t}catch{return}}return e}var k=_((0,h.join)(__dirname,"..","package.json")),g=_((0,h.join)(r,"package.json"));var p=m(require("fs-extra")),a=require("node:path"),b=require("node:child_process"),A=require("node:util"),d=m(require("yocto-spinner")),f=(0,A.promisify)(b.exec);function O(){try{let n=g();if(!n)return!0;let t=p.readJsonSync((0,a.join)(__dirname,"..","dist","package.json"));return n.version!==t.version}catch{return!0}}async function j(){let n=(0,d.default)({text:"Checking if PM2 is installed"}).start();try{return await f("pm2 -v"),n.success("PM2 already installed"),!0}catch{return n.warning("PM2 not installed"),!1}}async function C(){let n=(0,d.default)({text:"Installing PM2"}).start();try{await f("npm i -g pm2"),n.success("Installed PM2")}catch{n.error("Failed to install PM2"),process.exit(1)}}async function y(){let n=(0,d.default)({text:"Stop running instances of "+i}).start();try{await f(`pm2 stop "${i}"`),n.warning("Stopped "+i)}catch{n.success("No running instances of "+i+" found")}}async function N(){let n=(0,d.default)({text:"Create local server"}).start();p.copySync((0,a.join)(__dirname,"..","dist","code"),(0,a.join)(r,"code")),p.copySync((0,a.join)(__dirname,"..","dist","env",".env.default"),(0,a.join)(r,"env",".env.default")),p.copySync((0,a.join)(__dirname,"..","dist","package.json"),(0,a.join)(r,"package.json")),n.text="Install local server dependencies",await f("npm i",{cwd:r}),n.success("Local server installed")}var I=m(require("yocto-spinner")),w=m(require("open"));var F=require("node:net");async function T(n){return new Promise(t=>{let e=(0,F.createServer)().once("error",()=>{t(!1)}).once("listening",()=>{e.close()}).once("close",()=>t(!0)).listen(n,"0.0.0.0")})}var $=require("fs-extra");var M=require("node:path");function U(...n){let t={};for(let e of n){let o=e.split(`
3
+ `);for(let s of o){let u=s.trim();if(!u||u.startsWith("#"))continue;let v=u.indexOf("=");if(v===-1)continue;let H=u.slice(0,v).trim(),c=u.slice(v+1).trim();(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),t[H]=c}}return{getNumber:e=>nn(t[e]),getString:e=>tn(t[e]),getBoolean:e=>en(t[e])}}function X(n){let t=[];for(let e of n){let o=Z(e);o&&t.push(o)}return U(...t)}var P=X([".env.default",".env"]);function Z(n){try{return(0,$.readFileSync)((0,M.join)(r,"env",n),"utf-8")}catch{return}}function nn(n){if(!n)return;let t=Number(n);if(!isNaN(t)&&n.trim()!=="")return t;throw new Error("Wrong env value type")}function tn(n){if(n){if(typeof n=="string")return n;throw new Error("Wrong env value type")}}function en(n){if(!n)return;let t=n.toLowerCase();if(t==="true")return!0;if(t==="false")return!1;throw new Error("Wrong env value type")}async function rn(){await j()||await C(),await y();try{O()&&await N();let t=P.getNumber("PORT");if(!t)throw new Error("PORT env variable not found");if(!await T(t))throw new Error(`Port ${t} is occupied by another process`);let o=(0,I.default)({text:"Starting new instance of "+i}).start(),s=L.readJsonSync((0,W.join)(r,"package.json"));await f(`pm2 start "${s.main}" --name "${i}" --no-autorestart`,{cwd:r}),o.success("Local server will be available in a couple of seconds"),console.log("You can close this window"),await(0,w.default)(`http://localhost:${t}`),console.log(`App is running at http://localhost:${t} and https://app.dataramen.xyz`)}catch(t){console.error("Failed to start local server",t)}}async function on(){(0,V.execSync)(`pm2 logs ${i}`,{stdio:"inherit"})}async function sn(){await y()}function an(){console.log(`DataRamen CLI version: ${k().version}`),console.log(`DataRamen local server version: ${g().version}`)}async function cn(){let n=P.getNumber("PORT");await(0,w.default)(`http://localhost:${n}`)}var l={start:rn,logs:on,stop:sn,version:an,open:cn};(0,B.default)((0,J.hideBin)(process.argv)).command("start","Default command, start/restart the server",l.start).command(["logs"],"Listen for logs",l.logs).command("stop","Stop the server",l.stop).command("open","Stop the server",l.open).command(["version"],"Show version",l.version).parse();
@@ -1,9 +1,9 @@
1
- "use strict";var dt=Object.create;var ne=Object.defineProperty;var mt=Object.getOwnPropertyDescriptor;var pt=Object.getOwnPropertyNames;var ft=Object.getPrototypeOf,yt=Object.prototype.hasOwnProperty;var B=(a,e)=>()=>(e||a((e={exports:{}}).exports,e),e.exports);var ht=(a,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of pt(e))!yt.call(a,s)&&s!==t&&ne(a,s,{get:()=>e[s],enumerable:!(r=mt(e,s))||r.enumerable});return a};var P=(a,e,t)=>(t=a!=null?dt(ft(a)):{},ht(e||!a||!a.__esModule?ne(t,"default",{value:a,enumerable:!0}):t,a));var Me=B(qe=>{"use strict";Object.defineProperty(qe,"__esModule",{value:!0})});var xe=B(G=>{"use strict";Object.defineProperty(G,"__esModule",{value:!0});G.isString=void 0;var kt=a=>typeof a=="string";G.isString=kt});var Fe=B(L=>{"use strict";Object.defineProperty(L,"__esModule",{value:!0});L.SQLManipulator=L.SQLBuilder=L.SQLParser=void 0;var ve=xe(),K=class{constructor(e="mysql"){this.dialect=e}parse(e){let r=e.trim().replace(/;$/,"").replace(/\s+/g," "),s=r.toUpperCase(),o;if(s.startsWith("SELECT"))o=this.parseSelect(r);else if(s.startsWith("INSERT"))o=this.parseInsert(r);else if(s.startsWith("UPDATE"))o=this.parseUpdate(r);else if(s.startsWith("DELETE"))o=this.parseDelete(r);else throw new Error("Unsupported SQL statement type");return o.parameters=this.extractParameters(r),o}extractParameters(e){let t=/:(\w+)/g,r=[],s;for(;(s=t.exec(e))!==null;){let o=s[1];r.includes(o)||r.push(o)}return r}parseSelect(e){let t={type:"SELECT"},{cleanedSQL:r,subqueries:s}=this.extractSubqueries(e),o=r.match(/SELECT\s+(.*?)\s+FROM/i);if(o){let d=o[1].trim();t.columns=d==="*"?["*"]:this.parseColumns(d)}let n=r.match(/FROM\s+([^\s]+)(?:\s|$)/i);if(n&&(t.table=n[1]),!t.table){let d=r.match(/FROM\s+([^\s]+)(?:\s+(?:AS\s+)?([^\s]+))?(?:\s+(?:WHERE|JOIN|INNER|LEFT|RIGHT|FULL|GROUP|ORDER|LIMIT|OFFSET|HAVING)|$)/i);d&&(t.table=d[1])}t.joins=this.parseJoins(r);let u=r.match(/WHERE\s+(.*?)(?:\s+GROUP\s+BY|\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/i);u&&(t.where=this.restoreSubqueries(u[1].trim(),s));let i=r.match(/ORDER\s+BY\s+(.*?)(?:\s+LIMIT|\s+OFFSET|$)/i);i&&(t.orderBy=this.parseOrderBy(i[1]));let l=r.match(/GROUP\s+BY\s+(.*?)(?:\s+HAVING|\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/i);l&&(t.groupBy=this.parseColumns(l[1]));let m=r.match(/HAVING\s+(.*?)(?:\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/i);m&&(t.having=this.restoreSubqueries(m[1].trim(),s));let E=r.match(/LIMIT\s+(\d+)/i);E&&(t.limit=parseInt(E[1]));let p=r.match(/OFFSET\s+(\d+)/i);return p&&(t.offset=parseInt(p[1])),t}parseColumns(e){let t=[],r="",s=!1,o="",n=0;for(let u=0;u<e.length;u++){let i=e[u];!s&&(i==='"'||i==="'")?(s=!0,o=i,r+=i):s&&i===o?u+1<e.length&&e[u+1]===o?(r+=i+i,u++):(s=!1,o="",r+=i):!s&&i==="("?(n++,r+=i):!s&&i===")"?(n--,r+=i):!s&&i===","&&n===0?(t.push(r.trim()),r=""):r+=i}return r.trim()&&t.push(r.trim()),t}extractSubqueries(e){let t=new Map,r=e,s=0,o=/\(([^()]*(?:SELECT|INSERT|UPDATE|DELETE)[^()]*(?:\([^()]*\)[^()]*)*)\)/gi,n=!0;for(;n;)n=!1,r=r.replace(o,(u,i)=>{if(/\b(SELECT|INSERT|UPDATE|DELETE)\b/i.test(i)){let l=`__SUBQUERY_${s}__`;return t.set(l,u),s++,n=!0,l}return u});return{cleanedSQL:r,subqueries:t}}restoreSubqueries(e,t){let r=e;return t.forEach((s,o)=>{r=r.replace(new RegExp(o,"g"),s)}),r}parseJoins(e){let t=[],r=/((?:INNER|LEFT|RIGHT|FULL)?\s*JOIN)\s+(\w+(?:\s+\w+)?)\s+ON\s+(.*?)(?=\s+(?:INNER|LEFT|RIGHT|FULL)?\s*JOIN|\s+WHERE|\s+GROUP\s+BY|\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/gi,s;for(;(s=r.exec(e))!==null;){let o=s[1].trim().toUpperCase(),n=s[2].trim(),u=s[3].trim(),i=n.split(/\s+/),l=i[0],m=i.length>1?i[1]:void 0,E;o.includes("LEFT")?E="LEFT":o.includes("RIGHT")?E="RIGHT":o.includes("FULL")?E="FULL":E="INNER",t.push({type:E,table:l,alias:m,on:u})}return t.length>0?t:[]}parseInsert(e){let t={type:"INSERT"},r=e.match(/INSERT\s+INTO\s+(\w+)\s*\(([^)]+(?:\([^)]*\)[^)]*)*)\)\s*VALUES\s*\((.+)\)\s*;?$/i);return r&&(t.table=r[1],t.columns=this.parseColumns(r[2]),t.values=this.parseColumns(r[3])),t}parseUpdate(e){let t={type:"UPDATE"},r=e.match(/UPDATE\s+(\w+)\s+SET\s+(.*?)(?:\s+WHERE|$)/i);r&&(t.table=r[1],t.set=this.parseSetClause(r[2]));let s=e.match(/WHERE\s+(.*?)$/i);return s&&(t.where=s[1].trim()),t}parseDelete(e){let t={type:"DELETE"},r=e.match(/DELETE\s+FROM\s+(\w+)(?:\s+WHERE\s+(.*?))?$/i);return r&&(t.table=r[1],r[2]&&(t.where=r[2].trim())),t}parseOrderBy(e){return e.split(",").map(r=>{let s=r.trim().split(" "),o=s.pop();return o==="DESC"||o==="desc"?{column:s.join(" "),direction:"DESC"}:o==="ASC"||o==="asc"?{column:s.join(" "),direction:"ASC"}:{column:s.join(" ")+" "+o,direction:"ASC"}})}parseSetClause(e){let t={};return this.parseColumns(e).forEach(s=>{let o=s.indexOf("=");if(o>0){let n=s.substring(0,o).trim(),u=s.substring(o+1).trim();t[n]=u}}),t}};L.SQLParser=K;var $=class{constructor(e,t="mysql"){this.parsed={...e},this.dialect=t}build(){switch(this.parsed.type){case"SELECT":return this.buildSelect();case"INSERT":return this.buildInsert();case"UPDATE":return this.buildUpdate();case"DELETE":return this.buildDelete();default:throw new Error("Unsupported SQL type")}}buildSelect(){let e="SELECT ";if(this.parsed.columns&&this.parsed.columns.length>0?e+=this.parsed.columns.join(", "):e+="*",this.parsed.table&&(e+=` FROM ${this.parsed.table}`),this.parsed.joins&&this.parsed.joins.length>0&&this.parsed.joins.forEach(t=>{e+=` ${t.type} JOIN ${t.table} ON ${t.on}`}),this.parsed.where&&(e+=` WHERE ${this.parsed.where}`),this.parsed.groupBy&&this.parsed.groupBy.length>0&&(e+=` GROUP BY ${this.parsed.groupBy.join(", ")}`),this.parsed.having&&(e+=` HAVING ${this.parsed.having}`),this.parsed.orderBy&&this.parsed.orderBy.length>0){let t=this.parsed.orderBy.reduce((s,o)=>(s[o.column]=o.direction,s),{}),r=Object.entries(t).map(([s,o])=>`${s} ${o}`);e+=` ORDER BY ${r.join(", ")}`}return this.parsed.limit!==void 0&&(e+=` LIMIT ${this.parsed.limit}`),this.parsed.offset!==void 0&&(this.dialect==="mysql"?e+=` OFFSET ${this.parsed.offset}`:e+=` OFFSET ${this.parsed.offset}`),e}buildInsert(){if(!this.parsed.table||!this.parsed.columns||!this.parsed.values)throw new Error("Invalid INSERT statement data");let e=this.parsed.columns.join(", "),t=this.parsed.values.join(", ");return`INSERT INTO ${this.parsed.table} (${e}) VALUES (${t})`}buildUpdate(){if(!this.parsed.table||!this.parsed.set)throw new Error("Invalid UPDATE statement data");let e=Object.entries(this.parsed.set).map(([r,s])=>`${r} = ${s}`),t=`UPDATE ${this.parsed.table} SET ${e.join(", ")}`;return this.parsed.where&&(t+=` WHERE ${this.parsed.where}`),t}buildDelete(){if(!this.parsed.table)throw new Error("Invalid DELETE statement data");let e=`DELETE FROM ${this.parsed.table}`;return this.parsed.where&&(e+=` WHERE ${this.parsed.where}`),e}};L.SQLBuilder=$;var oe=class{constructor(e="mysql",t){this.dialect=e,this.parser=new K(e),this.parsed=t==="SELECT"?{type:"SELECT"}:this.parser.parse(t),this.parameters={}}setParameter(e,t){return this.parameters[e]=t,this}setParameters(e){return this.parameters={...this.parameters,...e},this}getParameter(e){return this.parameters[e]}getParameters(){return{...this.parameters}}clearParameters(){return this.parameters={},this}getRequiredParameters(){return this.parsed.parameters||[]}getMissingParameters(){let e=this.getRequiredParameters(),t=Object.keys(this.parameters);return e.filter(r=>!t.includes(r))}addWhereWithParam(e,t,r,s="AND"){let o=this.buildWhereConditionWithParam(e,t,r);return this.parsed.where?this.parsed.where+=` ${s} ${o}`:this.parsed.where=o,this.parsed.parameters||(this.parsed.parameters=[]),this.parsed.parameters.includes(r)||this.parsed.parameters.push(r),this}addWhere(e){let t=this.buildWhereCondition(e);if(this.parsed.where){let r=e.connector||"AND";this.parsed.where+=` ${r} ${t}`}else this.parsed.where=t;return this}addWhereRaw(e,t="AND"){return this.parsed.where?this.parsed.where+=` ${t} ${e}`:this.parsed.where=e,this}clearWhere(){return this.parsed.where=void 0,this}addOrderBy(...e){return this.parsed.orderBy||(this.parsed.orderBy=[]),this.parsed.orderBy.push(...e),this}clearOrderBy(){return this.parsed.orderBy=void 0,this}setLimit(e){return this.parsed.limit=e,this}setOffset(e){return this.parsed.offset=e,this}addGroupBy(e){this.parsed.groupBy||(this.parsed.groupBy=[]);let t=this.parsed.groupBy.findIndex(r=>r===e);return t>-1?this.parsed.groupBy[t]=e:this.parsed.groupBy.push(e),this}setHaving(e){return this.parsed.having=e,this}setTable(e){return this.parsed.table=e,this}addJoin(...e){if(this.parsed.type!=="SELECT")throw new Error("JOIN operations are only supported for SELECT queries");return this.parsed.joins||(this.parsed.joins=[]),this.parsed.joins.push(...e),this}selectColumns(e){if(this.parsed.type!=="SELECT")throw new Error("Column selection is only supported for SELECT queries");return this.parsed.columns=e,this}toSQL(e=!1,t=!1){let s=new $(this.parsed,this.dialect).build();return e&&(s=this.substituteParameters(s)),t&&(s+=";"),s}toParameterizedSQL(e=!1){let r=new $(this.parsed,this.dialect).build();return e?r+";":r}toExecutableSQL(e=!1){return this.toSQL(!0,e)}substituteParameters(e){let t=e;return Object.entries(this.parameters).forEach(([r,s])=>{let o=new RegExp(`:${r}\\b`,"g"),n=this.formatParameterValue(s);t=t.replace(o,n)}),t}formatParameterValue(e){return e==null?"NULL":typeof e=="string"?e:typeof e=="boolean"?this.dialect==="postgres"?e?"TRUE":"FALSE":e?"1":"0":Array.isArray(e)?`(${e.map(r=>this.formatParameterValue(r)).join(", ")})`:e instanceof Date?`'${e.toISOString().slice(0,19).replace("T"," ")}'`:String(e)}buildWhereConditionWithParam(e,t,r){switch(t){case"IS NULL":case"IS NOT NULL":return`${e} ${t}`;case"IN":case"NOT IN":return`${e} ${t} :${r}`;default:return`${e} ${t} :${r}`}}getParsed(){return{...this.parsed}}buildWhereCondition(e){let{column:t,operator:r,value:s}=e;switch(r){case"IS NULL":case"IS NOT NULL":return`${t} ${r}`;case"IN":case"NOT IN":let o=s?.map(i=>(0,ve.isString)(i.value)?`'${i.value}'`:i.value).join(", ");return`${t} ${r} (${o})`;default:let n=s?.[0],u;return(0,ve.isString)(n?.value)&&n?.isColumn!==!0?u=`'${n?.value}'`:u=n?.value,`${t} ${r} ${u}`}}};L.SQLManipulator=oe});var $e=B(k=>{"use strict";var Ut=k&&k.__createBinding||(Object.create?function(a,e,t,r){r===void 0&&(r=t);var s=Object.getOwnPropertyDescriptor(e,t);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(a,r,s)}:function(a,e,t,r){r===void 0&&(r=t),a[r]=e[t]}),Qe=k&&k.__exportStar||function(a,e){for(var t in a)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&Ut(e,a,t)};Object.defineProperty(k,"__esModule",{value:!0});Qe(Me(),k);Qe(Fe(),k)});var H=require("dotenv"),j=require("node:path"),ie=require("node:fs"),gt=(()=>{try{let a=(0,ie.readFileSync)((0,j.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(a)}catch{return{version:"0.0.0"}}})();(0,H.config)({path:[(0,j.join)(__dirname,"..","env",".env"),(0,j.join)(__dirname,"..","env",".env.default")]});(0,H.populate)(process.env,{SERVER_VERSION:gt.version});var it=P(require("fastify")),ut=P(require("@fastify/cors"));var c=class extends Error{constructor(t,r){super(r);this.status=t;this.message=r}};var ye=require("typeorm");var ue=require("typeorm"),V=new ue.EntitySchema({name:"DatabaseInspection",tableName:"db_inspection",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},tableName:{nullable:!0,type:String},columns:{type:"json",nullable:!0},createdAt:{type:"datetime",default:"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:"CURRENT_TIMESTAMP"}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var ce=require("typeorm"),z=new ce.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"}},relations:{users:{type:"many-to-many",target:()=>"User",inverseSide:"teams"},workbooks:{type:"one-to-many",target:()=>"Workbook",inverseSide:"team"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"team"},datasources:{type:"one-to-many",target:()=>"DataSource",inverseSide:"team"}}});var le=require("typeorm"),J=new le.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:"datetime",default:"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:"CURRENT_TIMESTAMP"}},relations:{teams:{type:"many-to-many",target:()=>"Team",inverseSide:"users",joinTable:!0},settings:{type:"one-to-one",target:()=>"UserSettings",inverseSide:"user",joinColumn:!0},currentTeam:{type:"many-to-one",target:()=>"Team",joinColumn:!0}}});var de=require("typeorm"),Z=new de.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},openAiToken:{type:String,nullable:!0},model:{type:String,default:"gpt-3.5-turbo"},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var me=require("typeorm"),X=new me.EntitySchema({name:"Workbook",tableName:"workbooks",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},path:{type:"uuid",generated:"uuid"},isTrash:{type:"boolean",default:!1},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"workbooks",joinColumn:!0}}});var pe=require("typeorm"),ee=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},dbType:{type:String},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},name:{type:String},description:{type:String,nullable:!0},dbDatabase:{type:String},dbSchema:{type:String,nullable:!0},lastInspected:{type:"datetime",nullable:!0,default:()=>null},status:{type:String,nullable:!0}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"datasources",joinColumn:!0},inspections:{type:"one-to-many",target:()=>"DatabaseInspection",inverseSide:"datasource"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"dataSource"},owner:{type:"many-to-one",target:()=>"User",joinColumn:!0}}});var he=P(require("os"));var fe=require("typeorm"),te=new fe.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",default:"{}"},isTrash:{type:Boolean,default:!1,nullable:!0},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"workbooks",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",inverseSide:"queries",joinColumn:!0}}});function Tt(){let a=process.env.TYPEORM_DATABASE;if(!a)throw new Error("Bad value for TYPEORM_DATABASE. Please check your config!");return a.startsWith("<home>")&&(a=a.replace("<home>",he.default.homedir())),a}var S=new ye.DataSource({type:process.env.TYPEORM_CONNECTION,database:Tt(),synchronize:process.env.TYPEORM_SYNCHRONIZE==="true",host:process.env.TYPEORM_HOST,username:process.env.TYPEORM_USERNAME,password:process.env.TYPEORM_PASSWORD,port:process.env.TYPEORM_PORT?parseInt(process.env.TYPEORM_PORT):void 0,logging:process.env.TYPEORM_LOGGING==="true",entities:[V,ee,z,J,Z,X,te]}),ge=async()=>{if(!S.isInitialized)return S.initialize();throw new Error("Already initialized")},N=S.getRepository(V),g=S.getRepository(ee),q=S.getRepository(z),I=S.getRepository(J),C=S.getRepository(Z),b=S.getRepository(X),R=S.getRepository(te);var Q=P(require("node:fs/promises")),re=require("node:path"),Te=P(require("node:os")),Et=Te.default.homedir(),ae=(0,re.join)(Et,".dataramen",".runtime","files"),Ee=a=>(0,re.join)(ae,a),Se=async a=>Q.default.readFile(Ee(a),{encoding:"utf8"}),we=async(a,e)=>Q.default.writeFile(Ee(a),e,{encoding:"utf8"});var be=async()=>{await St()||await Q.default.mkdir(ae,{recursive:!0})};async function St(){try{return(await Q.default.lstat(ae)).isDirectory()}catch{return!1}}var f=a=>(e,t,r)=>{a(e),r()};var Re=f(a=>{a.post("/workbook",async e=>({data:""}))});var y=(a,e)=>{let t=a.body;return e&&e(t),t},_=(a,e)=>{let t=a.query;return e&&e(t),t},h=(a,e)=>{let t=a.params;return e&&e(t),t};var D=a=>a.headers["phoenix-user-id"];var Ie=a=>{if(!a.dbUrl)throw new c(400,"url is required");if(!a.dbUser)throw new c(400,"user is required");if(!a.dbType)throw new c(400,"type is required");if(!a.name)throw new c(400,"name is required");if(!a.dbDatabase)throw new c(400,"database is required")};var Oe=P(require("mysql2/promise"));var bt=({dbDatabase:a,dbPassword:e,dbUser:t,dbUrl:r})=>Oe.default.createConnection({host:r,user:t,database:a,password:e}),Rt=async a=>{let e=`
1
+ "use strict";var tt=Object.create;var re=Object.defineProperty;var rt=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var ot=Object.getPrototypeOf,nt=Object.prototype.hasOwnProperty;var q=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var st=(t,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of at(e))!nt.call(t,o)&&o!==r&&re(t,o,{get:()=>e[o],enumerable:!(a=rt(e,o))||a.enumerable});return t};var _=(t,e,r)=>(r=t!=null?tt(ot(t)):{},st(e||!t||!t.__esModule?re(r,"default",{value:t,enumerable:!0}):r,t));var Ue=q(Pe=>{"use strict";Object.defineProperty(Pe,"__esModule",{value:!0})});var Z=q(R=>{"use strict";Object.defineProperty(R,"__esModule",{value:!0});R.buildWhereCondition=R.buildSelect=R.isString=void 0;var bt=t=>typeof t=="string";R.isString=bt;var It=t=>{let e="SELECT ";if(t.columns&&t.columns.length>0?e+=t.columns.join(", "):e+="*",t.table&&(e+=` FROM ${t.table}`),t.joins&&t.joins.length>0&&t.joins.forEach(r=>{e+=` ${r.type} JOIN ${r.table} ON ${r.on}`}),t.where&&(e+=` WHERE ${t.where}`),t.groupBy&&t.groupBy.length>0&&(e+=` GROUP BY ${t.groupBy.join(", ")}`),t.having&&(e+=` HAVING ${t.having}`),t.orderBy&&t.orderBy.length>0){let r=t.orderBy.reduce((o,n)=>(o[n.column]=n.direction,o),{}),a=Object.entries(r).map(([o,n])=>`${o} ${n}`);e+=` ORDER BY ${a.join(", ")}`}return t.limit!==void 0&&(e+=` LIMIT ${t.limit}`),t.offset!==void 0&&(e+=` OFFSET ${t.offset}`),e};R.buildSelect=It;var Rt=t=>{let{column:e,operator:r,value:a}=t;switch(r){case"IS NULL":case"IS NOT NULL":return`${e} ${r}`;case"IN":case"NOT IN":let o=a?.map(i=>(0,R.isString)(i.value)?`'${i.value}'`:i.value).join(", ");return`${e} ${r} (${o})`;default:let n=a?.[0],s;return(0,R.isString)(n?.value)&&n?.isColumn!==!0?s=`'${n?.value}'`:s=n?.value,`${e} ${r} ${s}`}};R.buildWhereCondition=Rt});var Le=q(B=>{"use strict";Object.defineProperty(B,"__esModule",{value:!0});B.SelectQueryBuilder=void 0;var Me=Z(),X=class{constructor(e="mysql"){this.dialect=e,this.skeleton={type:"SELECT"}}addWhere(e){let r=(0,Me.buildWhereCondition)(e);if(this.skeleton.where){let a=e.connector||"AND";this.skeleton.where+=` ${a} ${r}`}else this.skeleton.where=r;return this}addWhereRaw(e,r="AND"){return this.skeleton.where?this.skeleton.where+=` ${r} ${e}`:this.skeleton.where=e,this}clearWhere(){return this.skeleton.where=void 0,this}addOrderBy(...e){return this.skeleton.orderBy||(this.skeleton.orderBy=[]),this.skeleton.orderBy.push(...e),this}clearOrderBy(){return this.skeleton.orderBy=void 0,this}setLimit(e){return this.skeleton.limit=e,this}setOffset(e){return this.skeleton.offset=e,this}addGroupBy(e){this.skeleton.groupBy||(this.skeleton.groupBy=[]);let r=this.skeleton.groupBy.findIndex(a=>a===e);return r>-1?this.skeleton.groupBy[r]=e:this.skeleton.groupBy.push(e),this}setHaving(e){return this.skeleton.having=e,this}setTable(e){return this.skeleton.table=e,this}addJoin(...e){return this.skeleton.joins||(this.skeleton.joins=[]),this.skeleton.joins.push(...e),this}selectColumns(e){if(this.skeleton.type!=="SELECT")throw new Error("Column selection is only supported for SELECT queries");return this.skeleton.columns=e,this}toSQL(){return(0,Me.buildSelect)(this.skeleton)}};B.SelectQueryBuilder=X});var xe=q(C=>{"use strict";var Nt=C&&C.__createBinding||(Object.create?function(t,e,r,a){a===void 0&&(a=r);var o=Object.getOwnPropertyDescriptor(e,r);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,a,o)}:function(t,e,r,a){a===void 0&&(a=r),t[a]=e[r]}),ee=C&&C.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&Nt(e,t,r)};Object.defineProperty(C,"__esModule",{value:!0});ee(Ue(),C);ee(Le(),C);ee(Z(),C)});var $=require("dotenv"),Q=require("node:path"),ae=require("node:fs"),it=(()=>{try{let t=(0,ae.readFileSync)((0,Q.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(t)}catch{return{version:"0.0.0"}}})();(0,$.config)({path:[(0,Q.join)(__dirname,"..","env",".env"),(0,Q.join)(__dirname,"..","env",".env.default")]});(0,$.populate)(process.env,{SERVER_VERSION:it.version});var Ke=_(require("fastify")),ze=_(require("@fastify/cors")),Ve=_(require("@fastify/static"));var u=class extends Error{constructor(r,a){super(a);this.status=r;this.message=a}};var le=require("typeorm");var oe=require("typeorm"),W=new oe.EntitySchema({name:"DatabaseInspection",tableName:"db_inspection",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},tableName:{nullable:!0,type:String},columns:{type:"json",nullable:!0},createdAt:{type:"datetime",default:"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:"CURRENT_TIMESTAMP"}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var ne=require("typeorm"),j=new ne.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"}},relations:{users:{type:"many-to-many",target:()=>"User",inverseSide:"teams"},workbooks:{type:"one-to-many",target:()=>"Workbook",inverseSide:"team"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"team"},datasources:{type:"one-to-many",target:()=>"DataSource",inverseSide:"team"}}});var se=require("typeorm"),Y=new se.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:"datetime",default:"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:"CURRENT_TIMESTAMP"}},relations:{teams:{type:"many-to-many",target:()=>"Team",inverseSide:"users",joinTable:!0},settings:{type:"one-to-one",target:()=>"UserSettings",inverseSide:"user",joinColumn:!0},currentTeam:{type:"many-to-one",target:()=>"Team",joinColumn:!0}}});var ie=require("typeorm"),H=new ie.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},openAiToken:{type:String,nullable:!0},model:{type:String,default:"gpt-3.5-turbo"},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var ue=require("typeorm"),G=new ue.EntitySchema({name:"Workbook",tableName:"workbooks",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},path:{type:"uuid",generated:"uuid"},isTrash:{type:"boolean",default:!1},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"workbooks",joinColumn:!0}}});var ce=require("typeorm"),K=new ce.EntitySchema({name:"DataSource",tableName:"data_sources",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},dbUrl:{type:String},dbPort:{type:Number,nullable:!0},dbUser:{type:String},dbPassword:{type:String,nullable:!0},dbType:{type:String},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},name:{type:String},description:{type:String,nullable:!0},dbDatabase:{type:String},dbSchema:{type:String,nullable:!0},lastInspected:{type:"datetime",nullable:!0,default:()=>null},status:{type:String,nullable:!0}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"datasources",joinColumn:!0},inspections:{type:"one-to-many",target:()=>"DatabaseInspection",inverseSide:"datasource"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"dataSource"},owner:{type:"many-to-one",target:()=>"User",joinColumn:!0}}});var de=_(require("os"));var me=require("typeorm"),z=new me.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",default:"{}"},isTrash:{type:Boolean,default:!1,nullable:!0},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"workbooks",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",inverseSide:"queries",joinColumn:!0}}});function ut(){let t=process.env.TYPEORM_DATABASE;if(!t)throw new Error("Bad value for TYPEORM_DATABASE. Please check your config!");return t.startsWith("<home>")&&(t=t.replace("<home>",de.default.homedir())),t}var T=new le.DataSource({type:process.env.TYPEORM_CONNECTION,database:ut(),synchronize:process.env.TYPEORM_SYNCHRONIZE==="true",host:process.env.TYPEORM_HOST,username:process.env.TYPEORM_USERNAME,password:process.env.TYPEORM_PASSWORD,port:process.env.TYPEORM_PORT?parseInt(process.env.TYPEORM_PORT):void 0,logging:process.env.TYPEORM_LOGGING==="true",entities:[W,K,j,Y,H,G,z]}),pe=async()=>{if(!T.isInitialized)return T.initialize();throw new Error("Already initialized")},I=T.getRepository(W),l=T.getRepository(K),U=T.getRepository(j),b=T.getRepository(Y),M=T.getRepository(H),ye=T.getRepository(G),E=T.getRepository(z);var V=_(require("node:fs/promises")),fe=require("node:path"),Te=_(require("node:os")),ct=Te.default.homedir(),ge=(0,fe.join)(ct,".dataramen",".runtime","files"),Se=async()=>{await mt()||await V.default.mkdir(ge,{recursive:!0})};async function mt(){try{return(await V.default.lstat(ge)).isDirectory()}catch{return!1}}var g=t=>(e,r,a)=>{t(e),a()};var f=(t,e)=>{let r=t.body;return e&&e(r),r},x=(t,e)=>{let r=t.query;return e&&e(r),r},S=(t,e)=>{let r=t.params;return e&&e(r),r},A=t=>t.headers["phoenix-user-id"];var he=t=>{if(!t.dbUrl)throw new u(400,"url is required");if(!t.dbUser)throw new u(400,"user is required");if(!t.dbType)throw new u(400,"type is required");if(!t.name)throw new u(400,"name is required");if(!t.dbDatabase)throw new u(400,"database is required")};var we=_(require("mysql2/promise"));var lt=({dbDatabase:t,dbPassword:e,dbUser:r,dbUrl:a})=>we.default.createConnection({host:a,user:r,database:t,password:e}),dt=async t=>{let e=`
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
- `,[t]=await a.execute(e),r={};return t.forEach(s=>{let o=s.TABLE_NAME,n=s.COLUMN_NAME;r[o]||(r[o]=[]),r[o].push(n)}),r},It=async a=>{let e=`
6
+ `,[r]=await t.execute(e),a={};return r.forEach(o=>{let n=o.TABLE_NAME,s=o.COLUMN_NAME;a[n]||(a[n]=[]),a[n].push(s)}),a},pt=async t=>{let e=`
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
- `,[t]=await a.execute(e),r={};return Array.isArray(t)&&t.forEach(s=>{r[s.table_name]||(r[s.table_name]={}),r[s.table_name][s.field]={refTable:s.referenced_table,refField:s.referenced_field}}),r},Nt=async(a,e)=>{let r=(await e.query("SHOW TABLES"))[0],s=await It(e),o=await Rt(e),n=r.map(async u=>{let i=Object.values(u)[0],l=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${a.dbDatabase}' and table_name = '${i}'`,[m]=await e.query(l),E=s[i];return{columns:m.map(p=>({name:p.COLUMN_NAME,type:p.DATA_TYPE,isPrimary:o[i]?.includes(p.COLUMN_NAME),ref:E?.[p.COLUMN_NAME]?{table:E[p.COLUMN_NAME].refTable,field:E[p.COLUMN_NAME].refField}:void 0})).sort((p,d)=>p.isPrimary&&d.isPrimary?p.name.localeCompare(d.name):p.isPrimary?-1:1),createdAt:new Date,tableName:i,updatedAt:new Date}});return Promise.all(n)},Ne=async(a,e,t)=>{try{console.log(`[MYSQL CONN] Query: ${a}`);let[r,s]=await e.query({sql:a,rowsAsArray:!0}),o=r?.constructor?.name;if(o==="ResultSetHeader"){let n=r;if(n.affectedRows>3&&t.allowBulkUpdate!==!0)throw new Error("[MYSQL CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[n.affectedRows]],query:a}}else if(o==="Array"){let n=r;return{columns:s?.map(u=>({column:u.orgName||u.name,table:u.orgTable,alias:u.name,full:u.orgTable?u.orgTable+"."+u.orgName:u.name}))||[],rows:n,query:a}}throw new Error(`[MYSQL CONN] Unknown result type: ${o}`)}catch(r){throw console.error(r),r instanceof c?r:new c(400,r.message)}},Ot=async(a,e)=>{await a.beginTransaction();try{let t=await e();return await a.commit(),console.log("[MYSQL CONN] Commit"),t}catch(t){throw await a.rollback(),console.warn(t.message),console.log("[MYSQL CONN] Rollback"),t}},Ce=async a=>{let e=await bt(a),t=!1;return{dbType:"mysql",dataSource:a,inspectSchema:()=>Nt(a,e),executeQuery:(r,s)=>s.type==="SELECT"?Ne(r,e,s):Ot(e,()=>Ne(r,e,s)),checkConnection:async()=>e.ping(),isClosed:()=>t,close:async()=>{if(!t)return t=!0,e.destroy()}}};var Pe=P(require("pg"));var Ct=async({dbDatabase:a,dbPassword:e,dbUser:t,dbUrl:r,dbPort:s})=>{let o=new Pe.default.Client({host:r,user:t,database:a,password:e,port:s,query_timeout:1e4});return await o.connect(),o},At=async a=>{let t=await a.query(`
17
+ `,[r]=await t.execute(e),a={};return Array.isArray(r)&&r.forEach(o=>{a[o.table_name]||(a[o.table_name]={}),a[o.table_name][o.field]={refTable:o.referenced_table,refField:o.referenced_field}}),a},yt=async(t,e)=>{let a=(await e.query("SHOW TABLES"))[0],o=await pt(e),n=await dt(e),s=a.map(async i=>{let m=Object.values(i)[0],c=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${t.dbDatabase}' and table_name = '${m}'`,[w]=await e.query(c),N=o[m];return{columns:w.map(d=>({name:d.COLUMN_NAME,type:d.DATA_TYPE,isPrimary:n[m]?.includes(d.COLUMN_NAME),ref:N?.[d.COLUMN_NAME]?{table:N[d.COLUMN_NAME].refTable,field:N[d.COLUMN_NAME].refField}:void 0})).sort((d,p)=>d.isPrimary&&p.isPrimary?d.name.localeCompare(p.name):d.isPrimary?-1:1),createdAt:new Date,tableName:m,updatedAt:new Date}});return Promise.all(s)},Ee=async(t,e,r)=>{try{console.log(`[MYSQL CONN] Query: ${t}`);let[a,o]=await e.query({sql:t,rowsAsArray:!0}),n=a?.constructor?.name;if(n==="ResultSetHeader"){let s=a;if(s.affectedRows>3&&r.allowBulkUpdate!==!0)throw new Error("[MYSQL CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[s.affectedRows]],query:t}}else if(n==="Array"){let s=a;return{columns:o?.map(i=>({column:i.orgName||i.name,table:i.orgTable,alias:i.name,full:i.orgTable?i.orgTable+"."+i.orgName:i.name}))||[],rows:s,query:t}}throw new Error(`[MYSQL CONN] Unknown result type: ${n}`)}catch(a){throw console.error(a),a instanceof u?a:new u(400,a.message)}},ft=async(t,e)=>{await t.beginTransaction();try{let r=await e();return await t.commit(),console.log("[MYSQL CONN] Commit"),r}catch(r){throw await t.rollback(),console.warn(r.message),console.log("[MYSQL CONN] Rollback"),r}},be=async t=>{let e=await lt(t),r=!1;return{dbType:"mysql",dataSource:t,inspectSchema:()=>yt(t,e),executeQuery:(a,o)=>o.type==="SELECT"?Ee(a,e,o):ft(e,()=>Ee(a,e,o)),checkConnection:async()=>e.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,e.destroy()}}};var Re=_(require("pg"));var Tt=async({dbDatabase:t,dbPassword:e,dbUser:r,dbUrl:a,dbPort:o})=>{let n=new Re.default.Client({host:a,user:r,database:t,password:e,port:o,query_timeout:1e4});return await n.connect(),n},gt=async t=>{let r=await t.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
- `),r={};return t.rows.forEach(s=>{let o=s.table_name,n=s.column_name;r[o]||(r[o]=[]),r[o].push(n)}),r},Pt=async a=>{let t=await a.query(`
31
+ `),a={};return r.rows.forEach(o=>{let n=o.table_name,s=o.column_name;a[n]||(a[n]=[]),a[n].push(s)}),a},St=async t=>{let r=await t.query(`
32
32
  SELECT
33
33
  tc.table_name AS table_name,
34
34
  kcu.column_name AS field,
@@ -43,21 +43,21 @@
43
43
  ON ccu.constraint_name = tc.constraint_name
44
44
  AND ccu.table_schema = tc.table_schema
45
45
  WHERE tc.constraint_type = 'FOREIGN KEY';
46
- `),r={};return t.rows.forEach(s=>{r[s.table_name]||(r[s.table_name]={}),r[s.table_name][s.field]={refTable:s.referenced_table,refField:s.referenced_field}}),r},_t=async(a,e)=>{let t=`SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = '${a.dbSchema}'`,s=(await e.query(t)).rows,o=await Pt(e),n=await At(e),u=s.map(async i=>{let l=Object.values(i)[0],m=`
46
+ `),a={};return r.rows.forEach(o=>{a[o.table_name]||(a[o.table_name]={}),a[o.table_name][o.field]={refTable:o.referenced_table,refField:o.referenced_field}}),a},ht=async(t,e)=>{let r=`SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = '${t.dbSchema}'`,o=(await e.query(r)).rows,n=await St(e),s=await gt(e),i=o.map(async m=>{let c=Object.values(m)[0],w=`
47
47
  SELECT column_name, data_type
48
48
  FROM information_schema.columns
49
49
  WHERE
50
- table_name = '${l}' and
51
- table_schema = '${a.dbSchema}'
52
- `,{rows:E}=await e.query(m),p=o[l];return{columns:E.map(d=>({name:d.column_name,type:d.data_type,isPrimary:n[l]?.includes(d.column_name),ref:p?.[d.column_name]?{table:p[d.column_name].refTable,field:p[d.column_name].refField}:void 0})).sort((d,U)=>d.isPrimary&&U.isPrimary?d.name.localeCompare(U.name):d.isPrimary?-1:1),createdAt:new Date,tableName:l,updatedAt:new Date}});return Promise.all(u)},Dt=async(a,e)=>{let t=`select relname, attname, concat(pg_class.oid, '-', attnum) as row_key
50
+ table_name = '${c}' and
51
+ table_schema = '${t.dbSchema}'
52
+ `,{rows:N}=await e.query(w),d=n[c];return{columns:N.map(p=>({name:p.column_name,type:p.data_type,isPrimary:s[c]?.includes(p.column_name),ref:d?.[p.column_name]?{table:d[p.column_name].refTable,field:d[p.column_name].refField}:void 0})).sort((p,h)=>p.isPrimary&&h.isPrimary?p.name.localeCompare(h.name):p.isPrimary?-1:1),createdAt:new Date,tableName:c,updatedAt:new Date}});return Promise.all(i)},Et=async(t,e)=>{let r=`select relname, attname, concat(pg_class.oid, '-', attnum) as row_key
53
53
  from pg_attribute
54
54
  left join pg_class on pg_attribute.attrelid = pg_class.oid
55
55
  where
56
- concat(pg_class.oid, '-', attnum) IN (${a.join(", ")})
57
- limit 25;`;return(await e.query(t)).rows.reduce((s,o)=>(s[o.row_key]={table:o.relname,column:o.attname},s),{})},Ae=async(a,e,t)=>{try{console.log(`[PG CONN] Query: ${a}`);let{rows:r,fields:s,command:o,rowCount:n}=await e.query({text:a,rowMode:"array"});if(o==="UPDATE"||o==="INSERT"||o==="DELETE"){if(n!=null&&n>3&&t.allowBulkUpdate!==!0)throw new Error("[PG CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[n]],query:a}}if(o==="SELECT"){let u=s.map(l=>`'${l.tableID}-${l.columnID}'`),i=await Dt(u,e);return{columns:s.map(l=>{let m=i[`${l.tableID}-${l.columnID}`];return{column:m?.column||l.name,alias:l.name,table:m?.table||"",full:m?m.table+"."+m.column:l.name}}),rows:r,query:a}}throw new Error(`[PG CONN] Unsupported command: ${o}`)}catch(r){throw r instanceof c?r:new c(400,r.message)}},Lt=async(a,e)=>{await a.query("BEGIN");try{let t=await e();return await a.query("COMMIT"),console.log("[PG CONN] Commit"),t}catch(t){throw await a.query("ROLLBACK"),console.log("[PG CONN] Rollback"),t}},_e=async a=>{let e=await Ct(a),t=!1,r=!1,s=async o=>(r||await e.query(`SET search_path TO ${a.dbSchema}`),o());return{dbType:"postgres",dataSource:a,inspectSchema:()=>_t(a,e),executeQuery:(o,n)=>s(()=>n.type==="SELECT"?Ae(o,e,n):Lt(e,()=>Ae(o,e,n))),checkConnection:async()=>{},isClosed:()=>t,close:async()=>{if(!t)return t=!0,e.end()}}};var M=async(a,e)=>{try{let t;if(a.dbType==="mysql")t=await Ce(a);else if(a.dbType==="postgres")t=await _e(a);else throw new c(500,`Connection manager for ${a.dbType} not found`);return e.__connections?e.__connections.push(t):e.__connections=[t],t}catch(t){throw console.error(t),t instanceof c?t:t?.code==="ECONNREFUSED"?new c(500,"Failed to connect to the database"):new c(500,t.message)}};var De=f(a=>{a.get("/:id",async e=>{let{id:t}=h(e),r=await g.findOne({where:{id:t}});if(!r)throw new c(404,"Data source not found");return{data:r}}),a.get("/",async e=>{let{teamId:t}=_(e);return{data:await g.find({where:{team:{id:t}},order:{createdAt:"DESC"}})}}),a.post("/",async(e,t)=>{let{teamId:r,ownerId:s,...o}=y(e,Ie),n=g.create({...o,team:{id:r},owner:{id:s}}),u=await M(n,e);try{await u.checkConnection()}catch{throw new c(400,"Cannot connect to the database, please check datasource configuration")}return{data:await g.save(n)}}),a.put("/:id",async(e,t)=>{let{id:r}=h(e),s=y(e),o=await g.findOneBy({id:r});if(!o)throw new c(404,"Data source not found");let n=g.merge(o,s);return await g.save(n),{data:n}}),a.delete("/:id",async(e,t)=>S.transaction(async()=>{let{id:r}=h(e);await Promise.all([N.delete({datasource:{id:r}}),R.delete({dataSource:{id:r}})]),await g.delete({id:r})})),a.post("/:id/inspect",async(e,t)=>{let{id:r}=h(e),s=await g.findOneBy({id:r});if(!s)throw new Error("Data source not found");s.status="INSPECTING",await g.save(s);let n=await(await M(s,e)).inspectSchema();await N.delete({datasource:{id:r}}),await N.insert(n.sort().map(u=>N.create({tableName:u.tableName,columns:u.columns,datasource:{id:r}}))),s.status="READY",s.lastInspected=new Date,await g.save(s)}),a.get("/:id/inspections",async(e,t)=>{let{id:r}=h(e);return{data:await N.find({where:{datasource:{id:r}}})}})});var se=require("typeorm"),Le=f(a=>{a.get("/team/:teamId/files",async(e,t)=>{let{teamId:r}=h(e),s={where:{team:{id:r}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0}},[o=[],n=[],u=[]]=await Promise.all([g.find(s),b.find({...s,where:{...s.where,isTrash:!1}}),R.find({...s,where:{...s.where,isTrash:!1}})]);return{data:[...o.map(i=>({...i,type:"dataSource"})),...n.map(i=>({...i,type:"workbook"})),...u.map(i=>({...i,type:"query"}))]}}),a.get("/team/:teamId/trash",async e=>{let{teamId:t}=h(e);return{data:await S.query(`
56
+ concat(pg_class.oid, '-', attnum) IN (${t.join(", ")})
57
+ limit 25;`;return(await e.query(r)).rows.reduce((o,n)=>(o[n.row_key]={table:n.relname,column:n.attname},o),{})},Ie=async(t,e,r)=>{try{console.log(`[PG CONN] Query: ${t}`);let{rows:a,fields:o,command:n,rowCount:s}=await e.query({text:t,rowMode:"array"});if(n==="UPDATE"||n==="INSERT"||n==="DELETE"){if(s!=null&&s>3&&r.allowBulkUpdate!==!0)throw new Error("[PG CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[s]],query:t}}if(n==="SELECT"){let i=o.map(c=>`'${c.tableID}-${c.columnID}'`),m=await Et(i,e);return{columns:o.map(c=>{let w=m[`${c.tableID}-${c.columnID}`];return{column:w?.column||c.name,alias:c.name,table:w?.table||"",full:w?w.table+"."+w.column:c.name}}),rows:a,query:t}}throw new Error(`[PG CONN] Unsupported command: ${n}`)}catch(a){throw a instanceof u?a:new u(400,a.message)}},wt=async(t,e)=>{await t.query("BEGIN");try{let r=await e();return await t.query("COMMIT"),console.log("[PG CONN] Commit"),r}catch(r){throw await t.query("ROLLBACK"),console.log("[PG CONN] Rollback"),r}},Ne=async t=>{let e=await Tt(t),r=!1,a=!1,o=async n=>(a||await e.query(`SET search_path TO ${t.dbSchema}`),n());return{dbType:"postgres",dataSource:t,inspectSchema:()=>ht(t,e),executeQuery:(n,s)=>o(()=>s.type==="SELECT"?Ie(n,e,s):wt(e,()=>Ie(n,e,s))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,e.end()}}};var L=async(t,e)=>{try{let r;if(t.dbType==="mysql")r=await be(t);else if(t.dbType==="postgres")r=await Ne(t);else throw new u(500,`Connection manager for ${t.dbType} not found`);return e.__connections?e.__connections.push(r):e.__connections=[r],r}catch(r){throw console.error(r),r instanceof u?r:r?.code==="ECONNREFUSED"?new u(500,"Failed to connect to the database"):new u(500,r.message)}};var _e=g(t=>{t.get("/:id",async e=>{let{id:r}=S(e),a=await l.findOne({where:{id:r}});if(!a)throw new u(404,"Data source not found");return{data:a}}),t.get("/",async e=>{let{teamId:r}=x(e);return{data:await l.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}),t.post("/",async(e,r)=>{let{teamId:a,ownerId:o,...n}=f(e,he),s=l.create({...n,team:{id:a},owner:{id:o}}),i=await L(s,e);try{await i.checkConnection()}catch{throw new u(400,"Cannot connect to the database, please check datasource configuration")}return{data:await l.save(s)}}),t.put("/:id",async(e,r)=>{let{id:a}=S(e),o=f(e),n=await l.findOneBy({id:a});if(!n)throw new u(404,"Data source not found");let s=l.merge(n,o);return await l.save(s),{data:s}}),t.delete("/:id",async(e,r)=>T.transaction(async()=>{let{id:a}=S(e);await Promise.all([I.delete({datasource:{id:a}}),E.delete({dataSource:{id:a}})]),await l.delete({id:a})})),t.post("/:id/inspect",async(e,r)=>{let{id:a}=S(e),o=await l.findOneBy({id:a});if(!o)throw new Error("Data source not found");o.status="INSPECTING",await l.save(o);let s=await(await L(o,e)).inspectSchema();await I.delete({datasource:{id:a}}),await I.insert(s.sort().map(i=>I.create({tableName:i.tableName,columns:i.columns,datasource:{id:a}}))),o.status="READY",o.lastInspected=new Date,await l.save(o)}),t.get("/:id/inspections",async(e,r)=>{let{id:a}=S(e);return{data:await I.find({where:{datasource:{id:a}}})}})});var J=require("typeorm"),Ce=g(t=>{t.get("/team/:teamId/files",async(e,r)=>{let{teamId:a}=S(e),o={where:{team:{id:a}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0}},[n=[],s=[],i=[]]=await Promise.all([l.find(o),ye.find({...o,where:{...o.where,isTrash:!1}}),E.find({...o,where:{...o.where,isTrash:!1}})]);return{data:[...n.map(m=>({...m,type:"dataSource"})),...s.map(m=>({...m,type:"workbook"})),...i.map(m=>({...m,type:"query"}))]}}),t.get("/team/:teamId/trash",async e=>{let{teamId:r}=S(e);return{data:await T.query(`
58
58
  select id, name, updatedAt
59
59
  from workbooks
60
- where teamId = '${t}' AND (isTrash = true OR isTrash IS NULL)
60
+ where teamId = '${r}' AND (isTrash = true OR isTrash IS NULL)
61
61
  order by name asc
62
62
  limit 100;
63
- `)}}),a.get("/team/:teamId/query",async e=>{let{teamId:t}=h(e),{search:r,size:s}=_(e),o=(parseInt(s)||20)/2,[n,u]=await Promise.all([N.find({where:{tableName:(0,se.Like)(`%${r}%`),datasource:{team:{id:t}}},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:o}),R.find({where:{name:(0,se.Like)(`%${r}%`),isTrash:!1,dataSource:{team:{id:t}}},relations:{dataSource:!0},select:{id:!0,name:!0,dataSource:{name:!0,id:!0}},order:{name:"ASC"},take:o})]),i=[];return n.forEach(l=>{i.push({name:l.tableName,id:l.id,dataSourceName:l.datasource?.name||"--",dataSourceId:l.datasource?.id||"--",type:"table"})}),u.forEach(l=>{i.push({name:l.name,id:l.id,dataSourceName:l.dataSource?.name||"--",dataSourceId:l.dataSource?.id||"--",type:"query"})}),{data:i}})});function Y(a,e=void 0){try{if(a){let t=a.split("&"),r={};for(let s of t){let o=s.split(":");r[o[0]]=o[1]}return r}}catch{}return e}var ke=require("typeorm"),Ue=f(a=>{a.get("/",async e=>{let{dataSourceId:t,teamId:r,limit:s,orderBy:o,name:n}=_(e);if(!t&&!r)throw new c(400,"Either dsId or teamId is required");let u={isTrash:!1};return t&&(u.dataSource={id:t}),r&&(u.team={id:r}),n&&(u.name=(0,ke.Like)(`%${n}%`)),{data:await R.find({where:u,take:s,order:Y(o,{createdAt:"DESC"})})}}),a.get("/:id",async e=>{let{id:t}=h(e),r=await R.findOne({where:{id:t},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return r?{data:r}:{status:404,data:"Query not found"}}),a.post("/",async e=>{let t=y(e),r=await g.findOne({where:{id:t.dataSourceId},relations:{team:!0}});return{data:await R.save(R.create({name:t.name,isTrash:!1,opts:t.opts,team:{id:r?.team.id},dataSource:{id:t.dataSourceId}}))}}),a.patch("/:id",async e=>{let{id:t}=h(e),r=y(e);if(!(await R.update(t,r)).affected)throw new c(404,"Workbook not found");return{data:await R.findOneBy({id:t})}}),a.delete("/:id",async e=>S.transaction(async()=>{let{id:t}=h(e);if(!(await R.delete({id:t})).affected)return{status:404,data:"Workbook not found"}}))});var Ge=P($e()),Ke=require("typeorm");function We(a,e,t){return`${a.replace(/;\s*$/,"").trim()} LIMIT ${e} OFFSET ${t}`}function Be(a,e){return a.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g,(t,r)=>{if(!(r in e))throw new Error(`Missing value for SQL variable: ${r}`);return String(e[r])})}function je(a){let t=a.replace(/--.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").trim().match(/^\s*(\(?\s*)*([a-zA-Z]+)/);if(!t)throw new c(400,"Failed to detect query type");return t[2].toUpperCase()}var He=[{value:"=",label:"equals"},{value:"<>",label:"not equal"},{value:">",label:"greater than"},{value:">=",label:"greater than or equal"},{value:"<",label:"less than"},{value:"<=",label:"less than or equal"},{value:"LIKE",label:"contains"},{value:"NOT LIKE",label:"not contains"},{value:"ILIKE",label:"case-insensitive contains"},{value:"NOT ILIKE",label:"case-insensitive not contains"},{value:"IN",label:"in list"},{value:"NOT IN",label:"not in list"},{value:"IS NULL",label:"is null"},{value:"IS NOT NULL",label:"is not null"}],qt=He.reduce((a,e)=>(a[e.value]=e.label,a),{}),ra=He.reduce((a,e)=>(a[e.label]=e.value,a),{}),x=a=>a.map(e=>({label:qt[e],value:e})),aa=x(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),sa=x(["=","<>","LIKE","NOT LIKE","ILIKE","NOT ILIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),oa=x(["=","<>","IS NULL","IS NOT NULL"]),na=x(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),ia=x(["IS NULL","IS NOT NULL"]),ua=x(["IN","NOT IN"]);var Ye=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"];function Mt(a){return a||20}function xt(a){return a||0}function vt(a){return a.includes(" ")&&!a.startsWith("'")?`\`${a}\``:a}var Ve=async(a,{table:e,variables:t,datasourceId:r,filters:s,joins:o,orderBy:n,size:u,page:i,columns:l,groupBy:m,searchAll:E})=>{let p=await g.findOneBy({id:r}),d=[],U=[];if(!p)throw new c(404,"Data source not found");let w=new Ge.SQLManipulator(p.dbType,"SELECT");if(w.setTable(e),t&&w.setParameters(t),w.getParsed().type!=="SELECT")throw new c(400,"Only SELECT queries are allowed in this endpoint");w.setLimit(u||20),w.setOffset(u*i),s?.forEach(T=>{w.addWhere(Ft(T))}),o&&w.addJoin(...o),n&&w.addOrderBy(...n.map(T=>({...T,column:vt(T.column)}))),m&&m.length>0&&m.forEach(T=>w.addGroupBy(T));let F=w.getParsed();F.table&&d.push(F.table),F.joins&&F.joins.length>0&&F.joins.forEach(T=>{d.push(T.table)});let ct=await N.find({where:{tableName:(0,Ke.In)(d),datasource:{id:r}}});for(let T of ct)if(T.columns)for(let A of T.columns)U.push({column:A.name,table:T.tableName||"",full:`${T.tableName}.${A.name}`,type:A.type});let W;if(l&&l.length>0?W=l:W=U.map(T=>T.full),w.selectColumns(W),E){let T=U.filter(A=>Ye.includes(A.type)&&W.includes(A.full));if(T.length>0){let A=T.map(lt=>`LOWER(${lt.full}) LIKE '%${E.toLowerCase()}%'`);w.addWhereRaw(`(${A.join(" OR ")})`,"AND")}}return{...await(await M(p,a)).executeQuery(w.toExecutableSQL(),{type:w.getParsed().type,allowBulkUpdate:!1}),tables:d,allColumns:U}},ze=async(a,{sql:e,variables:t,datasourceId:r,size:s,page:o})=>{let n=await g.findOneBy({id:r});if(!n)throw new c(404,"Data source not found");let u=je(e),i=e;if(u==="SELECT"){if(i.match(/LIMIT|OFFSET/ig))throw new c(400,"Queries are automatically paginated, do not use LIMIT and/or OFFSET");let m=Mt(s);i=We(i,m,m*xt(o))}return t&&(i=Be(i,t)),(await M(n,a)).executeQuery(i,{type:u,allowBulkUpdate:!1})};function Ft(a){let e={...a};switch(e.operator){case"IS NULL":case"IS NOT NULL":e.value=void 0;break;case"LIKE":case"ILIKE":case"NOT LIKE":case"NOT ILIKE":e.value=e.value?.map(t=>({isColumn:t?.isColumn,value:`%${t?.value}%`}));break}return e}var Je=f(a=>{a.post("/sql",async e=>{let t=y(e);return{data:await Ve(e,t)}}),a.post("/raw",async e=>{let t=y(e);return{data:await ze(e,t)}})});var Ze=require("node:child_process"),Xe=f(a=>{a.get("/",async(e,t)=>({data:{active:!0,version:process.env.SERVER_VERSION}})),a.get("/logs",async()=>{(0,Ze.spawn)(`echo "${process.env.SERVER_VERSION}"`)})});var et=f(a=>{a.get("/",async(e,t)=>{let r=D(e);return{data:await q.find({where:{users:{id:r}}})}}),a.post("/",async(e,t)=>S.transaction(async()=>{let r=D(e),s=y(e),o=I.create();o.id=r;let n=q.create(s);return n.users=[o],await q.save(n),{data:n}}))});var tt=async a=>({email:"local@localhost",sub:"local"});async function rt(){let a=q.create({name:"Personal"}),e=await I.save(I.create({}));return a.users=[e],await q.save(a),await I.update(e.id,{currentTeam:{id:a.id}}),I.findOne({where:{},relations:{currentTeam:!0}})}var at=f(a=>{a.post("/register",async(e,t)=>{let r=await tt(e);if(!r?.email||!r?.sub)throw new c(400,"Invalid token");return{data:await rt()}}),a.get("/",async(e,t)=>{let r=await I.findOne({where:{},relations:{currentTeam:!0}});return r?{data:r}:{data:await rt()}}),a.put("/",async(e,t)=>{let r=D(e),s=y(e);if(!(await I.update(r,s)).affected)throw new c(404,"User not found");return{data:I.findOneBy({id:r})}}),a.put("/team",async(e,t)=>{let r=D(e),s=y(e);return await I.update(r,{currentTeam:{id:s.teamId}}),{data:await I.findOne({where:{id:r},relations:{currentTeam:!0}})}})});var Qt="********************************************",st=a=>a.slice(0,4)+Qt+a.slice(a.length-4);function $t(a){let e=C.create(a);return a.openAiToken&&(e.openAiToken=st(a.openAiToken)),e}var ot=f(a=>{a.get("/",async e=>{let t=D(e),r=await C.findOneBy({user:{id:t}});return r||(r=await C.save(C.create({user:{id:t},model:"gpt-4o"}))),{data:$t(r)}}),a.patch("/",async e=>{let{settings:t}=y(e);if(!t.id)throw new c(400,"Settings id is required!");if(!(await C.update(t.id,t)).affected)throw new c(404,"You do not own these settings!");return{data:await C.findOneBy({id:t.id})}})});var nt=f(a=>{a.get("/",async e=>{let{dsId:t,teamId:r,limit:s,orderBy:o}=_(e);if(!t&&!r)throw new c(400,"Either dsId or teamId is required");return{data:await b.find({where:{team:{id:r},isTrash:!1},take:s,order:Y(o,{createdAt:"DESC"})})}}),a.get("/:id",async e=>{let{id:t}=h(e),r=await b.findOneBy({id:t});return r?{data:r}:{status:404,data:"Workbook not found"}}),a.post("/",async e=>{let t=y(e);return{data:await b.save(b.create({name:t.name,isTrash:!1,team:{id:t.teamId}}))}}),a.patch("/:id",async e=>{let{id:t}=h(e),r=y(e);if(!(await b.update(t,r)).affected)throw new c(404,"Workbook not found");return{data:await b.findOneBy({id:t})}}),a.delete("/:id",async e=>{let{id:t}=h(e);if(!(await b.delete({id:t})).affected)return{status:404,data:"Workbook not found"}}),a.get("/:id/content",async e=>{let{id:t}=h(e),r=await b.findOneBy({id:t});if(!r)throw new c(404,"Workbook not found");try{let s=await Se(r?.path);if(s)return{data:s}}catch{}return{data:""}}),a.patch("/:id/content",async e=>{let{id:t}=h(e),r=y(e),s=await b.findOneBy({id:t});if(!s?.path)throw new c(404,"Workbook not found");await we(s?.path,r.content),await b.update(s.id,{updatedAt:new Date})})});var v=(0,it.default)(),Wt=process.env.PORT?parseInt(process.env.PORT):4466;function O(a,e){v.register(a,{prefix:e}),console.log("Registered "+e)}async function Bt(){await be(),O(Re,"/api/chat"),O(De,"/api/data-sources"),O(Le,"/api/project"),O(Ue,"/api/queries"),O(Je,"/api/runner"),O(Xe,"/api/status"),O(et,"/api/teams"),O(at,"/api/users"),O(ot,"/api/user-settings"),O(nt,"/api/workbooks"),v.register(ut.default,{origin:"*",methods:"*"}),v.addHook("onResponse",async a=>{a.__connections&&a.__connections.forEach(e=>{e.close()})}),v.setErrorHandler((a,e,t)=>{if(a instanceof c){console.error(a),t.status(a.status).send({error:a.message});return}else console.error(a),t.status(500).send({error:"Internal Server Error"})}),await v.after(),await ge(),v.listen({port:Wt,host:"0.0.0.0"},(a,e)=>{a&&(console.error(a),process.exit(1)),console.log(`Server listening at ${e}`)})}Bt();
63
+ `)}}),t.get("/team/:teamId/query",async e=>{let{teamId:r}=S(e),{search:a,size:o}=x(e),n=(parseInt(o)||20)/2,[s,i]=await Promise.all([I.find({where:{tableName:(0,J.Like)(`%${a}%`),datasource:{team:{id:r}}},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:n}),E.find({where:{name:(0,J.Like)(`%${a}%`),isTrash:!1,dataSource:{team:{id:r}}},relations:{dataSource:!0},select:{id:!0,name:!0,dataSource:{name:!0,id:!0}},order:{name:"ASC"},take:n})]),m=[];return s.forEach(c=>{m.push({name:c.tableName,id:c.id,dataSourceName:c.datasource?.name||"--",dataSourceId:c.datasource?.id||"--",type:"table"})}),i.forEach(c=>{m.push({name:c.name,id:c.id,dataSourceName:c.dataSource?.name||"--",dataSourceId:c.dataSource?.id||"--",type:"query"})}),{data:m}})});function Oe(t,e=void 0){try{if(t){let r=t.split("&"),a={};for(let o of r){let n=o.split(":");a[n[0]]=n[1]}return a}}catch{}return e}var Ae=require("typeorm"),De=g(t=>{t.get("/",async e=>{let{dataSourceId:r,teamId:a,limit:o,orderBy:n,name:s}=x(e);if(!r&&!a)throw new u(400,"Either dsId or teamId is required");let i={isTrash:!1};return r&&(i.dataSource={id:r}),a&&(i.team={id:a}),s&&(i.name=(0,Ae.Like)(`%${s}%`)),{data:await E.find({where:i,take:o,order:Oe(n,{createdAt:"DESC"})})}}),t.get("/:id",async e=>{let{id:r}=S(e),a=await E.findOne({where:{id:r},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return a?{data:a}:{status:404,data:"Query not found"}}),t.post("/",async e=>{let r=f(e),a=await l.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await E.save(E.create({name:r.name,isTrash:!1,opts:r.opts,team:{id:a?.team.id},dataSource:{id:r.dataSourceId}}))}}),t.patch("/:id",async e=>{let{id:r}=S(e),a=f(e);if(!(await E.update(r,a)).affected)throw new u(404,"Workbook not found");return{data:await E.findOneBy({id:r})}}),t.delete("/:id",async e=>T.transaction(async()=>{let{id:r}=S(e);if(!(await E.delete({id:r})).affected)return{status:404,data:"Workbook not found"}}))});var F=_(xe()),qe=require("typeorm");var ve=[{value:"=",label:"equals"},{value:"<>",label:"not equal"},{value:">",label:"greater than"},{value:">=",label:"greater than or equal"},{value:"<",label:"less than"},{value:"<=",label:"less than or equal"},{value:"LIKE",label:"contains"},{value:"NOT LIKE",label:"not contains"},{value:"ILIKE",label:"case-insensitive contains"},{value:"NOT ILIKE",label:"case-insensitive not contains"},{value:"IN",label:"in list"},{value:"NOT IN",label:"not in list"},{value:"IS NULL",label:"is null"},{value:"IS NOT NULL",label:"is not null"}],_t=ve.reduce((t,e)=>(t[e.value]=e.label,t),{}),qr=ve.reduce((t,e)=>(t[e.label]=e.value,t),{}),v=t=>t.map(e=>({label:_t[e],value:e})),Qr=v(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),$r=v(["=","<>","LIKE","NOT LIKE","ILIKE","NOT ILIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),Br=v(["=","<>","IS NULL","IS NOT NULL"]),Fr=v(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),Wr=v(["IS NULL","IS NOT NULL"]),jr=v(["IN","NOT IN"]);var ke=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"];function Ct(t){return t.includes(" ")&&!t.startsWith("'")?`\`${t}\``:t}var te=async(t,{table:e,datasourceId:r,filters:a,joins:o,orderBy:n,size:s,page:i,columns:m,groupBy:c,searchAll:w})=>{let N=await l.findOneBy({id:r}),d=[e],p=[];if(!N)throw new u(404,"Data source not found");let h=new F.SelectQueryBuilder(N.dbType);h.setTable(e),h.setLimit(s||20),h.setOffset(s*i),a?.forEach(y=>{h.addWhere(At(y))}),o&&(h.addJoin(...o),o.forEach(y=>{d.push(y.table)})),n&&h.addOrderBy(...n.map(y=>({...y,column:Ct(y.column)}))),c&&c.length>0&&c.forEach(y=>h.addGroupBy(y));let Xe=await I.find({where:{tableName:(0,qe.In)(d),datasource:{id:r}}});for(let y of Xe)if(y.columns)for(let O of y.columns)p.push({column:O.name,table:y.tableName||"",full:`${y.tableName}.${O.name}`,type:O.type});let k;if(m&&m.length>0?k=m:k=p.map(y=>y.full),h.selectColumns(k),w){let y=p.filter(O=>ke.includes(O.type)&&k.includes(O.full));if(y.length>0){let O=y.map(et=>`LOWER(${et.full}) LIKE '%${w.toLowerCase()}%'`);h.addWhereRaw(`(${O.join(" OR ")})`,"AND")}}return{...await(await L(N,t)).executeQuery(h.toSQL(),{type:"SELECT",allowBulkUpdate:!1}),tables:d,allColumns:p}},Qe=async(t,e)=>{let r=await l.findOneBy({id:e.datasourceId});if(!r)throw new u(404,"Data source not found");let a=e.values.map(({value:i,column:m})=>typeof i=="string"?i&&i.startsWith("=")?`${m}=${i.substring(1)}`:`${m}='${i}'`:`${m}='${i}'`).join(", "),o=e.filters.map(F.buildWhereCondition).join(" AND "),n=`UPDATE ${e.table} SET ${a} WHERE ${o}`;return(await L(r,t)).executeQuery(n,{type:"UPDATE",allowBulkUpdate:!1})},$e=async(t,e)=>{let r=await l.findOneBy({id:e.datasourceId});if(!r)throw new u(404,"Data source not found");let{keys:a,values:o}=Ot(e.values),n=`INSERT INTO ${e.table} (${a}) VALUES (${o})`;return(await L(r,t)).executeQuery(n,{type:"INSERT",allowBulkUpdate:!1})},Ot=t=>{let e=t.map(({column:a})=>a).join(", "),r=t.map(({value:a})=>typeof a=="string"?a&&a.startsWith("=")?a.substring(1):`'${a}'`:a).join(", ");return{keys:e,values:r}},At=t=>{let e={...t};switch(e.operator){case"IS NULL":case"IS NOT NULL":e.value=void 0;break;case"LIKE":case"ILIKE":case"NOT LIKE":case"NOT ILIKE":e.value=e.value?.map(r=>({isColumn:r?.isColumn,value:`%${r?.value}%`}));break}return e};var Be=g(t=>{t.post("/sql",async e=>{let r=f(e);return{data:await te(e,r)}}),t.post("/select",async e=>{let r=f(e);return{data:await te(e,r)}}),t.post("/insert",async e=>{let r=f(e);return{data:await $e(e,r)}}),t.post("/update",async e=>{let r=f(e);return{data:await Qe(e,r)}})});var Fe=require("node:child_process"),We=g(t=>{t.get("/",async(e,r)=>({data:{active:!0,version:process.env.SERVER_VERSION}})),t.get("/logs",async()=>{(0,Fe.spawn)(`echo "${process.env.SERVER_VERSION}"`)})});var je=g(t=>{t.get("/",async(e,r)=>{let a=A(e);return{data:await U.find({where:{users:{id:a}}})}}),t.post("/",async(e,r)=>T.transaction(async()=>{let a=A(e),o=f(e),n=b.create();n.id=a;let s=U.create(o);return s.users=[n],await U.save(s),{data:s}}))});async function Dt(){let t=U.create({name:"Personal"}),e=await b.save(b.create({}));return t.users=[e],await U.save(t),await b.update(e.id,{currentTeam:{id:t.id}}),b.findOne({where:{},relations:{currentTeam:!0}})}var Ye=g(t=>{t.get("/",async(e,r)=>{let a=await b.findOne({where:{},relations:{currentTeam:!0}});return a?{data:a}:{data:await Dt()}}),t.put("/",async(e,r)=>{let a=A(e),o=f(e);if(!(await b.update(a,o)).affected)throw new u(404,"User not found");return{data:b.findOneBy({id:a})}}),t.put("/team",async(e,r)=>{let a=A(e),o=f(e);return await b.update(a,{currentTeam:{id:o.teamId}}),{data:await b.findOne({where:{id:a},relations:{currentTeam:!0}})}})});var Pt="********************************************",He=t=>t.slice(0,4)+Pt+t.slice(t.length-4);function Ut(t){let e=M.create(t);return t.openAiToken&&(e.openAiToken=He(t.openAiToken)),e}var Ge=g(t=>{t.get("/",async e=>{let r=A(e),a=await M.findOneBy({user:{id:r}});return a||(a=await M.save(M.create({user:{id:r},model:"gpt-4o"}))),{data:Ut(a)}}),t.patch("/",async e=>{let{settings:r}=f(e);if(!r.id)throw new u(400,"Settings id is required!");if(!(await M.update(r.id,r)).affected)throw new u(404,"You do not own these settings!");return{data:await M.findOneBy({id:r.id})}})});var Je=require("node:path"),P=(0,Ke.default)(),Ze=process.env.PORT?parseInt(process.env.PORT):4466,Mt=["https://app.dataramen.xyz","https://dataramen.xyz","http://localhost:3000","http://localhost:3001",`http://localhost:${Ze}`];function D(t,e){P.register(t,{prefix:e}),console.log("Registered "+e)}async function Lt(){await Se(),D(_e,"/api/data-sources"),D(Ce,"/api/project"),D(De,"/api/queries"),D(Be,"/api/runner"),D(We,"/api/status"),D(je,"/api/teams"),D(Ye,"/api/users"),D(Ge,"/api/user-settings"),P.register(Ve.default,{root:(0,Je.join)(__dirname,"web")}),P.get("/",(t,e)=>{e.sendFile("index.html")}),P.register(ze.default,{origin:(t,e)=>{!t||Mt.includes(t)?e(null,!0):e(new Error("Not allowed by CORS"),!1)},methods:"*"}),P.addHook("onResponse",async t=>{t.__connections&&t.__connections.forEach(e=>{e.close()})}),P.setErrorHandler((t,e,r)=>{if(t instanceof u){console.error(t),r.status(t.status).send({error:t.message});return}else console.error(t),r.status(500).send({error:"Internal Server Error"})}),await P.after(),await pe(),P.listen({port:Ze,host:"127.0.0.1"},(t,e)=>{t&&(console.error(t),process.exit(1)),console.log(`Server listening at ${e}`)})}Lt();