@dataramen/cli 0.0.3 → 0.0.5-4.beta-1
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 +75 -0
- package/bin/run.js +5 -93
- package/dist/README.md +75 -0
- package/dist/code/cli.js +5 -0
- package/dist/code/migrations/1754425464078-InitialMigration.js +1 -0
- package/dist/code/migrations/1755358316764-usersManagement.js +1 -0
- package/dist/code/migrations/1758316062697-queriesHistory.js +1 -0
- package/dist/code/migrations/1760039807820-multipleWorkbenches.js +1 -0
- package/dist/code/migrations/1760816916693-workbenchTabs.js +1 -0
- package/dist/code/migrations/1762376647080-link-tab-to-datasource.js +1 -0
- package/dist/code/migrations/1762683837767-addSearchIndexes.js +1 -0
- package/dist/code/server.js +57 -0
- package/dist/code/web/assets/index-DAWKNwhd.js +237 -0
- package/dist/code/web/assets/index-DaVU481k.css +1 -0
- package/dist/code/web/dataramen.png +0 -0
- package/dist/code/web/dataramen.svg +85 -0
- package/dist/code/web/index.html +16 -0
- package/dist/code/web/robots.txt +2 -0
- package/dist/package.json +1 -1
- package/package.json +30 -5
- package/dist/code/proxy.js +0 -63
- package/dist/env/.env.default +0 -5
package/README.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# 🍜 DataRamen CLI
|
|
2
|
+
|
|
3
|
+
Your cozy corner for exploring and working with SQL databases - no query writing required.
|
|
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, and insert/update data - all from your browser.
|
|
6
|
+
|
|
7
|
+
## ✨ Features
|
|
8
|
+
|
|
9
|
+
- 🔌 **Connect to PostgreSQL & MySQL**
|
|
10
|
+
Securely plug in your credentials - you're ready to explore.
|
|
11
|
+
|
|
12
|
+
- 🧭 **Visual Schema Explorer**
|
|
13
|
+
Instantly browse tables, columns, types, primary/foreign keys, and relationships.
|
|
14
|
+
|
|
15
|
+
- 🧙 **No-SQL Querying**
|
|
16
|
+
Filter, sort, join, and summarize data using a beautiful, intuitive interface.
|
|
17
|
+
|
|
18
|
+
- 🔗 **Follow Relationships Easily**
|
|
19
|
+
Click to expand related records.
|
|
20
|
+
|
|
21
|
+
- ✏️ **Insert & Update Visually**
|
|
22
|
+
Add or modify rows with a visual editor - no SQL errors.
|
|
23
|
+
|
|
24
|
+
- 💾 **Save Queries**
|
|
25
|
+
Save your favorite views for quick access later.
|
|
26
|
+
|
|
27
|
+
## 🛠️ Installation
|
|
28
|
+
|
|
29
|
+
### 1. Install Node.js
|
|
30
|
+
|
|
31
|
+
DataRamen requires Node.js **v22 or above**.
|
|
32
|
+
👉 [Download Node.js](https://nodejs.org/)
|
|
33
|
+
|
|
34
|
+
### 2. Install DataRamen CLI
|
|
35
|
+
|
|
36
|
+
Open your terminal and run:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npm i -g @dataramen/cli
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 🖥️ Usage
|
|
43
|
+
|
|
44
|
+
### Start the Local Server
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
dataramen start
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Open the App
|
|
51
|
+
|
|
52
|
+
Go to `localhost:4466` in your browser. Your local server will connect automatically.
|
|
53
|
+
|
|
54
|
+
### Update the App
|
|
55
|
+
|
|
56
|
+
You can update DataRamen CLI using `NPM` install command:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npm i -g @dataramen/cli
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The above command will install latest stable version.
|
|
63
|
+
|
|
64
|
+
## 🔧 Additional CLI Commands
|
|
65
|
+
|
|
66
|
+
| Command | Description |
|
|
67
|
+
|-------------------|----------------------------------|
|
|
68
|
+
| `dataramen start` | Start the local DataRamen server |
|
|
69
|
+
| `dataramen stop` | Stop the local server |
|
|
70
|
+
| `dataramen open` | Open local webapp |
|
|
71
|
+
| `dataramen logs` | Show logs from the running server|
|
|
72
|
+
|
|
73
|
+
## ❤️ Made with love by [Oleksandr Demian](https://github.com/OleksandrDemian)
|
|
74
|
+
|
|
75
|
+
Visit [dataramen.xyz](https://dataramen.xyz) for more info.
|
package/bin/run.js
CHANGED
|
@@ -1,93 +1,5 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const os = require('node:os');
|
|
7
|
-
const fs = require("fs-extra");
|
|
8
|
-
|
|
9
|
-
const processName = "@dataramen/local-server";
|
|
10
|
-
|
|
11
|
-
const homeDir = os.homedir();
|
|
12
|
-
const filesPath = path.join(homeDir, ".dataramen", ".runtime", "server");
|
|
13
|
-
|
|
14
|
-
yargs()
|
|
15
|
-
.command("start", 'Default command, start/restart the server', () => {
|
|
16
|
-
const hasPm2 = checkPm2();
|
|
17
|
-
if (!hasPm2) {
|
|
18
|
-
installPm2();
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
start();
|
|
22
|
-
})
|
|
23
|
-
.command("logs", 'Listen for logs', () => {
|
|
24
|
-
execSync(`pm2 logs ${processName}`, {
|
|
25
|
-
stdio: "inherit",
|
|
26
|
-
});
|
|
27
|
-
})
|
|
28
|
-
.command("stop", 'Stop the server', () => {
|
|
29
|
-
execSync(`pm2 stop ${processName}`, {
|
|
30
|
-
stdio: "inherit",
|
|
31
|
-
})
|
|
32
|
-
})
|
|
33
|
-
.parse(yargsHelpers.hideBin(process.argv));
|
|
34
|
-
|
|
35
|
-
function checkPm2 () {
|
|
36
|
-
try {
|
|
37
|
-
execSync(`pm2 -v`, {
|
|
38
|
-
stdio: "inherit"
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
return true;
|
|
42
|
-
} catch (e) {
|
|
43
|
-
console.error("Library does not exist");
|
|
44
|
-
return false;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function installPm2 () {
|
|
49
|
-
console.log("Install Pm2");
|
|
50
|
-
execSync(`npm i -g pm2`, {
|
|
51
|
-
stdio: "inherit"
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function stopExisting () {
|
|
56
|
-
try {
|
|
57
|
-
execSync(`pm2 stop "${processName}"`);
|
|
58
|
-
} catch (e) {}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function installServer () {
|
|
62
|
-
console.log("Installing Server");
|
|
63
|
-
// copy code
|
|
64
|
-
fs.copySync(path.join(__dirname, '..', 'dist', "code"), path.join(filesPath, "code"));
|
|
65
|
-
// copy default env (do not override existing .env)
|
|
66
|
-
fs.copySync(path.join(__dirname, '..', 'dist', "env", ".env.default"), path.join(filesPath, "env", ".env.default"));
|
|
67
|
-
// copy package.json
|
|
68
|
-
fs.copySync(path.join(__dirname, '..', 'dist', "package.json"), path.join(filesPath, "package.json"));
|
|
69
|
-
|
|
70
|
-
execSync(`npm i --omit=dev`, {
|
|
71
|
-
stdio: "inherit",
|
|
72
|
-
cwd: filesPath,
|
|
73
|
-
});
|
|
74
|
-
console.log("Server installed");
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
function start () {
|
|
78
|
-
stopExisting();
|
|
79
|
-
|
|
80
|
-
try {
|
|
81
|
-
installServer();
|
|
82
|
-
console.log("Starting local server");
|
|
83
|
-
const pkg = fs.readJsonSync(path.join(filesPath, "package.json"));
|
|
84
|
-
execSync(`pm2 start "${pkg.main}" --name "${processName}" --no-autorestart`, {
|
|
85
|
-
stdio: "inherit",
|
|
86
|
-
cwd: filesPath,
|
|
87
|
-
});
|
|
88
|
-
console.log(`Local server will be available in a couple of seconds`);
|
|
89
|
-
console.log(`You can close this window`);
|
|
90
|
-
} catch (e) {
|
|
91
|
-
console.error(`Failed to start local server`, e);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
1
|
+
#!/usr/bin/env node
|
|
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,a)=>{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:!(a=U(t,n))||a.enumerable});return e};var l=(e,t,r)=>(r=e!=null?G(z(e)):{},X(t||!e||!e.__esModule?x(r,"default",{value:e,enumerable:!0}):r,e));var D=l(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 Y=require("node:path"),K=l(require("fs-extra")),L=require("node:child_process");var C=l(require("fs-extra")),w=require("node:path");function A(e){let t;function r(){try{return t||(t=C.readJsonSync(e)),t}catch{return}}return r}var N=A((0,w.join)(__dirname,"..","package.json")),v=A((0,w.join)(i,"package.json"));var f=l(require("fs-extra")),p=require("node:path"),k=require("node:child_process"),M=require("node:util"),E=l(require("yocto-spinner")),g=(0,M.promisify)(k.exec);function $(){try{let e=v();if(!e)return!0;let t=f.readJsonSync((0,p.join)(__dirname,"..","dist","package.json"));return e.version!==t.version}catch{return!0}}async function W(){let e=(0,E.default)({text:"Checking if PM2 is installed"}).start();try{return await g("pm2 -v"),e.success("PM2 already installed"),!0}catch{return e.warning("PM2 not installed"),!1}}async function j(){let e=(0,E.default)({text:"Installing PM2"}).start();try{await 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 I(){let e=(0,E.default)({text:"Create local server"}).start();f.removeSync((0,p.join)(i,"code")),f.copySync((0,p.join)(__dirname,"..","dist","code"),(0,p.join)(i,"code")),f.copySync((0,p.join)(__dirname,"..","dist","package.json"),(0,p.join)(i,"package.json")),e.text="Install local server dependencies",await g("npm i",{cwd:i}),e.success("Local server installed")}var P=l(require("yocto-spinner")),_=l(require("open"));var J=require("node:net");async function H(e){return new Promise(t=>{let r=(0,J.createServer)().once("error",()=>{t(!1)}).once("listening",()=>{r.close()}).once("close",()=>t(!0)).listen(e,"127.0.0.1")})}var h=l(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 a=r.split(`
|
|
3
|
+
`);for(let n of a){let s=n.trim();if(!s||s.startsWith("#"))continue;let d=s.indexOf("=");if(d===-1)continue;let y=s.slice(0,d).trim(),u=s.slice(d+1).trim();(u.startsWith('"')&&u.endsWith('"')||u.startsWith("'")&&u.endsWith("'"))&&(u=u.slice(1,-1)),t[y]=u}}return t}function ne(){let e={customValues:{},fileName:".env"};function t(){e.customValues=te(e.fileName)}function r(){let s=Object.entries(e.customValues).map(([d,y])=>`${d}=${y}`).join(`
|
|
4
|
+
`)+`
|
|
5
|
+
`;(0,S.writeFileSync)((0,b.join)(i,e.fileName),s,{encoding:"utf8"})}function a(n){if(e.customValues[n])return e.customValues[n]}return t(),{getNumber:n=>re(a(n)),getString:n=>oe(a(n)),getBoolean:n=>se(a(n)),flush:r,set:(n,s)=>{e.customValues[n]=s},unset:n=>{delete e.customValues[n]}}}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 o=ne();function O(){let e=!1;if(!o.getString("SYMM_ENCRYPTION_KEY")){let t=h.randomBytes(32).toString("hex");o.set("SYMM_ENCRYPTION_KEY",t),console.log("Generated random SYMM_ENCRYPTION_KEY"),e=!0}if(!o.getString("JWT_SECRET")){let t=h.randomBytes(32).toString("hex");o.set("JWT_SECRET",t),console.log("Generated random JWT_SECRET"),e=!0}if(!o.getString("JWT_REFRESH_SECRET")){let t=h.randomBytes(32).toString("hex");o.set("JWT_REFRESH_SECRET",t),console.log("Generated random JWT_REFRESH_SECRET"),e=!0}e&&o.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 a=Date.now();for(;Date.now()-a<t;){if(await ie(e))return!0;await new Promise(s=>setTimeout(s,r))}return!1};async function le(){await W()||await j(),await R();try{$()&&await I(),O();let t=o.getNumber("PORT")||4466;if(!t)throw new Error("PORT env variable not found");if(!await H(t))throw new Error(`Port ${t} is occupied by another process`);let a=(0,P.default)({text:"Starting new instance of "+c}).start(),n=K.readJsonSync((0,Y.join)(i,"package.json"));await g(`pm2 start "${n.main}" --name "${c}" --no-autorestart -- "${i}/.env"`,{cwd:i}),a.success("Local server will be available in a couple of seconds");let s=(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}`),s.success(`App is running at http://localhost:${t}`)):s.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 ue(){await R()}function pe(){console.log(`DataRamen CLI version: ${N().version}`),console.log(`DataRamen local server version: ${v().version}`)}async function fe(){let e=o.getNumber("PORT");await(0,_.default)(`http://localhost:${e}`)}function de(e){o.set(e.prop,e.value),o.flush(),console.log(`Environment property set: ${e.prop}`)}function ge(e){o.unset(e.prop),o.flush(),console.log(`Environment property unset: ${e.prop}`)}var m={start:le,logs:me,stop:ue,version:pe,open:fe,setEnvVariable:de,unsetEnvVariable:ge};(0,D.default)((0,B.hideBin)(process.argv)).command({command:"start",describe:"Start local server, restarts if already running",handler:m.start}).command({command:"logs",describe:"Listen for logs",handler:m.logs}).command({command:"stop",describe:"Stop the server",handler:m.stop}).command({command:"open",describe:"Stop the server",handler:m.open}).command({command:"set [prop] [value]",describe:"Set env value",handler:m.setEnvVariable}).command({command:"unset [prop]",describe:"Remove env value",handler:m.unsetEnvVariable}).command({command:"version",describe:"Show version",handler:m.version}).parse();
|
package/dist/README.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# 🍜 DataRamen CLI
|
|
2
|
+
|
|
3
|
+
Your cozy corner for exploring and working with SQL databases - no query writing required.
|
|
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, and insert/update data - all from your browser.
|
|
6
|
+
|
|
7
|
+
## ✨ Features
|
|
8
|
+
|
|
9
|
+
- 🔌 **Connect to PostgreSQL & MySQL**
|
|
10
|
+
Securely plug in your credentials - you're ready to explore.
|
|
11
|
+
|
|
12
|
+
- 🧭 **Visual Schema Explorer**
|
|
13
|
+
Instantly browse tables, columns, types, primary/foreign keys, and relationships.
|
|
14
|
+
|
|
15
|
+
- 🧙 **No-SQL Querying**
|
|
16
|
+
Filter, sort, join, and summarize data using a beautiful, intuitive interface.
|
|
17
|
+
|
|
18
|
+
- 🔗 **Follow Relationships Easily**
|
|
19
|
+
Click to expand related records.
|
|
20
|
+
|
|
21
|
+
- ✏️ **Insert & Update Visually**
|
|
22
|
+
Add or modify rows with a visual editor - no SQL errors.
|
|
23
|
+
|
|
24
|
+
- 💾 **Save Queries**
|
|
25
|
+
Save your favorite views for quick access later.
|
|
26
|
+
|
|
27
|
+
## 🛠️ Installation
|
|
28
|
+
|
|
29
|
+
### 1. Install Node.js
|
|
30
|
+
|
|
31
|
+
DataRamen requires Node.js **v22 or above**.
|
|
32
|
+
👉 [Download Node.js](https://nodejs.org/)
|
|
33
|
+
|
|
34
|
+
### 2. Install DataRamen CLI
|
|
35
|
+
|
|
36
|
+
Open your terminal and run:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npm i -g @dataramen/cli
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 🖥️ Usage
|
|
43
|
+
|
|
44
|
+
### Start the Local Server
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
dataramen start
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Open the App
|
|
51
|
+
|
|
52
|
+
Go to `localhost:4466` in your browser. Your local server will connect automatically.
|
|
53
|
+
|
|
54
|
+
### Update the App
|
|
55
|
+
|
|
56
|
+
You can update DataRamen CLI using `NPM` install command:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npm i -g @dataramen/cli
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The above command will install latest stable version.
|
|
63
|
+
|
|
64
|
+
## 🔧 Additional CLI Commands
|
|
65
|
+
|
|
66
|
+
| Command | Description |
|
|
67
|
+
|-------------------|----------------------------------|
|
|
68
|
+
| `dataramen start` | Start the local DataRamen server |
|
|
69
|
+
| `dataramen stop` | Stop the local server |
|
|
70
|
+
| `dataramen open` | Open local webapp |
|
|
71
|
+
| `dataramen logs` | Show logs from the running server|
|
|
72
|
+
|
|
73
|
+
## ❤️ Made with love by [Oleksandr Demian](https://github.com/OleksandrDemian)
|
|
74
|
+
|
|
75
|
+
Visit [dataramen.xyz](https://dataramen.xyz) for more info.
|
package/dist/code/cli.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
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,a)=>{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:!(a=U(t,n))||a.enumerable});return e};var l=(e,t,r)=>(r=e!=null?G(z(e)):{},X(t||!e||!e.__esModule?x(r,"default",{value:e,enumerable:!0}):r,e));var D=l(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 Y=require("node:path"),K=l(require("fs-extra")),L=require("node:child_process");var C=l(require("fs-extra")),w=require("node:path");function A(e){let t;function r(){try{return t||(t=C.readJsonSync(e)),t}catch{return}}return r}var N=A((0,w.join)(__dirname,"..","package.json")),v=A((0,w.join)(i,"package.json"));var f=l(require("fs-extra")),p=require("node:path"),k=require("node:child_process"),M=require("node:util"),E=l(require("yocto-spinner")),g=(0,M.promisify)(k.exec);function $(){try{let e=v();if(!e)return!0;let t=f.readJsonSync((0,p.join)(__dirname,"..","dist","package.json"));return e.version!==t.version}catch{return!0}}async function W(){let e=(0,E.default)({text:"Checking if PM2 is installed"}).start();try{return await g("pm2 -v"),e.success("PM2 already installed"),!0}catch{return e.warning("PM2 not installed"),!1}}async function j(){let e=(0,E.default)({text:"Installing PM2"}).start();try{await 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 I(){let e=(0,E.default)({text:"Create local server"}).start();f.removeSync((0,p.join)(i,"code")),f.copySync((0,p.join)(__dirname,"..","dist","code"),(0,p.join)(i,"code")),f.copySync((0,p.join)(__dirname,"..","dist","package.json"),(0,p.join)(i,"package.json")),e.text="Install local server dependencies",await g("npm i",{cwd:i}),e.success("Local server installed")}var P=l(require("yocto-spinner")),_=l(require("open"));var J=require("node:net");async function H(e){return new Promise(t=>{let r=(0,J.createServer)().once("error",()=>{t(!1)}).once("listening",()=>{r.close()}).once("close",()=>t(!0)).listen(e,"127.0.0.1")})}var h=l(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 a=r.split(`
|
|
3
|
+
`);for(let n of a){let s=n.trim();if(!s||s.startsWith("#"))continue;let d=s.indexOf("=");if(d===-1)continue;let y=s.slice(0,d).trim(),u=s.slice(d+1).trim();(u.startsWith('"')&&u.endsWith('"')||u.startsWith("'")&&u.endsWith("'"))&&(u=u.slice(1,-1)),t[y]=u}}return t}function ne(){let e={customValues:{},fileName:".env"};function t(){e.customValues=te(e.fileName)}function r(){let s=Object.entries(e.customValues).map(([d,y])=>`${d}=${y}`).join(`
|
|
4
|
+
`)+`
|
|
5
|
+
`;(0,S.writeFileSync)((0,b.join)(i,e.fileName),s,{encoding:"utf8"})}function a(n){if(e.customValues[n])return e.customValues[n]}return t(),{getNumber:n=>re(a(n)),getString:n=>oe(a(n)),getBoolean:n=>se(a(n)),flush:r,set:(n,s)=>{e.customValues[n]=s},unset:n=>{delete e.customValues[n]}}}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 o=ne();function O(){let e=!1;if(!o.getString("SYMM_ENCRYPTION_KEY")){let t=h.randomBytes(32).toString("hex");o.set("SYMM_ENCRYPTION_KEY",t),console.log("Generated random SYMM_ENCRYPTION_KEY"),e=!0}if(!o.getString("JWT_SECRET")){let t=h.randomBytes(32).toString("hex");o.set("JWT_SECRET",t),console.log("Generated random JWT_SECRET"),e=!0}if(!o.getString("JWT_REFRESH_SECRET")){let t=h.randomBytes(32).toString("hex");o.set("JWT_REFRESH_SECRET",t),console.log("Generated random JWT_REFRESH_SECRET"),e=!0}e&&o.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 a=Date.now();for(;Date.now()-a<t;){if(await ie(e))return!0;await new Promise(s=>setTimeout(s,r))}return!1};async function le(){await W()||await j(),await R();try{$()&&await I(),O();let t=o.getNumber("PORT")||4466;if(!t)throw new Error("PORT env variable not found");if(!await H(t))throw new Error(`Port ${t} is occupied by another process`);let a=(0,P.default)({text:"Starting new instance of "+c}).start(),n=K.readJsonSync((0,Y.join)(i,"package.json"));await g(`pm2 start "${n.main}" --name "${c}" --no-autorestart -- "${i}/.env"`,{cwd:i}),a.success("Local server will be available in a couple of seconds");let s=(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}`),s.success(`App is running at http://localhost:${t}`)):s.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 ue(){await R()}function pe(){console.log(`DataRamen CLI version: ${N().version}`),console.log(`DataRamen local server version: ${v().version}`)}async function fe(){let e=o.getNumber("PORT");await(0,_.default)(`http://localhost:${e}`)}function de(e){o.set(e.prop,e.value),o.flush(),console.log(`Environment property set: ${e.prop}`)}function ge(e){o.unset(e.prop),o.flush(),console.log(`Environment property unset: ${e.prop}`)}var m={start:le,logs:me,stop:ue,version:pe,open:fe,setEnvVariable:de,unsetEnvVariable:ge};(0,D.default)((0,B.hideBin)(process.argv)).command({command:"start",describe:"Start local server, restarts if already running",handler:m.start}).command({command:"logs",describe:"Listen for logs",handler:m.logs}).command({command:"stop",describe:"Stop the server",handler:m.stop}).command({command:"open",describe:"Stop the server",handler:m.open}).command({command:"set [prop] [value]",describe:"Set env value",handler:m.setEnvVariable}).command({command:"unset [prop]",describe:"Remove env value",handler:m.unsetEnvVariable}).command({command:"version",describe:"Show version",handler:m.version}).parse();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var n=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var o=Object.prototype.hasOwnProperty;var c=(r,e)=>{for(var u in e)n(r,u,{get:e[u],enumerable:!0})},p=(r,e,u,m)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of l(e))!o.call(r,s)&&s!==u&&n(r,s,{get:()=>e[s],enumerable:!(m=i(e,s))||m.enumerable});return r};var T=r=>p(n({},"__esModule",{value:!0}),r);var b={};c(b,{InitialMigration1754425464078:()=>d});module.exports=T(b);var a=require("typeorm");var t=process.env.APP_DB_TYPE==="sqlite"?"datetime":"timestamp";var d=class{name="InitialMigration1754425464078";async up(e){await e.createTable(new a.Table({name:"teams",columns:[{name:"id",type:"uuid",isPrimary:!0,isGenerated:!0,generationStrategy:"uuid"},{name:"name",type:"varchar",isNullable:!1},{name:"createdAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"updatedAt",type:t,default:"CURRENT_TIMESTAMP"}]})),await e.createTable(new a.Table({name:"users",columns:[{name:"id",type:"uuid",isPrimary:!0,isGenerated:!0,generationStrategy:"uuid"},{name:"createdAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"updatedAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"currentTeamId",type:"uuid",isNullable:!0}]})),await e.createTable(new a.Table({name:"users_to_teams",columns:[{name:"id",type:"uuid",isPrimary:!0,isGenerated:!0,generationStrategy:"uuid"},{name:"role",type:"varchar",isNullable:!1,default:"'admin'"},{name:"teamId",type:"uuid",isNullable:!0},{name:"userId",type:"uuid",isNullable:!0}]})),await e.createTable(new a.Table({name:"user_settings",columns:[{name:"id",type:"uuid",isPrimary:!0,isGenerated:!0,generationStrategy:"uuid"},{name:"createdAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"updatedAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"userId",type:"uuid",isUnique:!0}]})),await e.createTable(new a.Table({name:"data_sources",columns:[{name:"id",type:"uuid",isPrimary:!0,isGenerated:!0,generationStrategy:"uuid"},{name:"dbUrl",type:"varchar"},{name:"dbPort",type:"int",isNullable:!0},{name:"dbUser",type:"varchar"},{name:"dbPassword",type:"varchar",isNullable:!0},{name:"dbPasswordIv",type:"varchar",isNullable:!0},{name:"dbPasswordTag",type:"varchar",isNullable:!0},{name:"dbType",type:"varchar"},{name:"createdAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"updatedAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"name",type:"varchar"},{name:"description",type:"varchar",isNullable:!0},{name:"dbDatabase",type:"varchar"},{name:"dbSchema",type:"varchar",isNullable:!0},{name:"allowInsert",type:"boolean",default:!1},{name:"allowUpdate",type:"boolean",default:!1},{name:"lastInspected",type:t,isNullable:!0},{name:"status",type:"varchar",isNullable:!0},{name:"teamId",type:"uuid",isNullable:!0},{name:"ownerId",type:"uuid",isNullable:!0}]})),await e.createTable(new a.Table({name:"query",columns:[{name:"id",type:"uuid",isPrimary:!0,isGenerated:!0,generationStrategy:"uuid"},{name:"name",type:"varchar"},{name:"opts",type:"json",default:"'{}'"},{name:"isTrash",type:"boolean",isNullable:!0,default:!1},{name:"createdAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"updatedAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"teamId",type:"uuid",isNullable:!0},{name:"dataSourceId",type:"uuid",isNullable:!0}]})),await e.createTable(new a.Table({name:"db_inspection",columns:[{name:"id",type:"uuid",isPrimary:!0,isGenerated:!0,generationStrategy:"uuid"},{name:"tableName",type:"varchar",isNullable:!0},{name:"columns",type:"json",isNullable:!0},{name:"createdAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"updatedAt",type:t,default:"CURRENT_TIMESTAMP"},{name:"datasourceId",type:"uuid",isNullable:!0}]})),await e.createForeignKey("users",new a.TableForeignKey({columnNames:["currentTeamId"],referencedTableName:"users_to_teams",referencedColumnNames:["id"]})),await e.createForeignKeys("users_to_teams",[new a.TableForeignKey({columnNames:["teamId"],referencedTableName:"teams",referencedColumnNames:["id"]}),new a.TableForeignKey({columnNames:["userId"],referencedTableName:"users",referencedColumnNames:["id"]})]),await e.createForeignKey("user_settings",new a.TableForeignKey({columnNames:["userId"],referencedTableName:"users",referencedColumnNames:["id"]})),await e.createForeignKeys("data_sources",[new a.TableForeignKey({columnNames:["teamId"],referencedTableName:"teams",referencedColumnNames:["id"]}),new a.TableForeignKey({columnNames:["ownerId"],referencedTableName:"users",referencedColumnNames:["id"]})]),await e.createForeignKeys("query",[new a.TableForeignKey({columnNames:["teamId"],referencedTableName:"teams",referencedColumnNames:["id"]}),new a.TableForeignKey({columnNames:["dataSourceId"],referencedTableName:"data_sources",referencedColumnNames:["id"]})]),await e.createForeignKey("db_inspection",new a.TableForeignKey({columnNames:["datasourceId"],referencedTableName:"data_sources",referencedColumnNames:["id"]}))}async down(e){await e.dropTable("db_inspection",!0),await e.dropTable("query",!0),await e.dropTable("data_sources",!0),await e.dropTable("user_settings",!0),await e.dropTable("users_to_teams",!0),await e.dropTable("users",!0),await e.dropTable("teams",!0)}};0&&(module.exports={InitialMigration1754425464078});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var s=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var t=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var c=(r,e)=>{for(var a in e)s(r,a,{get:e[a],enumerable:!0})},l=(r,e,a,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of t(e))!p.call(r,n)&&n!==a&&s(r,n,{get:()=>e[n],enumerable:!(o=m(e,n))||o.enumerable});return r};var d=r=>l(s({},"__esModule",{value:!0}),r);var w={};c(w,{UsersManagement1755358316764:()=>i});module.exports=d(w);var u=require("typeorm"),i=class{name="UsersManagement1755358316764";async up(e){await e.addColumns("users",[new u.TableColumn({name:"username",type:"varchar",isUnique:!0}),new u.TableColumn({name:"password",type:"varchar"})])}async down(e){await e.dropColumns("users",["username","password"])}};0&&(module.exports={UsersManagement1755358316764});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var m=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var o=Object.prototype.hasOwnProperty;var c=(r,e)=>{for(var n in e)m(r,n,{get:e[n],enumerable:!0})},N=(r,e,n,d)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of l(e))!o.call(r,s)&&s!==n&&m(r,s,{get:()=>e[s],enumerable:!(d=i(e,s))||d.enumerable});return r};var T=r=>N(m({},"__esModule",{value:!0}),r);var b={};c(b,{QueriesHistory1758316062697:()=>t});module.exports=T(b);var a=require("typeorm");var u=process.env.APP_DB_TYPE==="sqlite"?"datetime":"timestamp";var t=class{name="QueriesHistory1758316062697";async up(e){await e.createTable(new a.Table({name:"saved_queries",columns:[{name:"id",type:"uuid",isPrimary:!0,isGenerated:!0,generationStrategy:"uuid"},{name:"isPersonal",type:"boolean"},{name:"createdAt",type:u,default:"CURRENT_TIMESTAMP"},{name:"updatedAt",type:u,default:"CURRENT_TIMESTAMP"},{name:"teamId",type:"uuid",isNullable:!0},{name:"queryId",type:"uuid",isNullable:!1},{name:"userId",type:"uuid",isNullable:!1}]})),await e.createForeignKeys("saved_queries",[new a.TableForeignKey({columnNames:["teamId"],referencedTableName:"teams",referencedColumnNames:["id"]}),new a.TableForeignKey({columnNames:["userId"],referencedTableName:"users",referencedColumnNames:["id"]}),new a.TableForeignKey({columnNames:["queryId"],referencedTableName:"query",referencedColumnNames:["id"]})]),await e.addColumns("query",[new a.TableColumn({name:"userId",type:"uuid",isNullable:!0})]),await e.createForeignKeys("query",[new a.TableForeignKey({columnNames:["userId"],referencedTableName:"users",referencedColumnNames:["id"]})])}async down(e){await e.dropForeignKeys("query",[new a.TableForeignKey({columnNames:["userId"],referencedTableName:"users",referencedColumnNames:["id"]})]),await e.dropColumns("query",["userId"]),await e.dropForeignKeys("saved_queries",[new a.TableForeignKey({columnNames:["teamId"],referencedTableName:"teams",referencedColumnNames:["id"]}),new a.TableForeignKey({columnNames:["userId"],referencedTableName:"users",referencedColumnNames:["id"]}),new a.TableForeignKey({columnNames:["queryId"],referencedTableName:"query",referencedColumnNames:["id"]})]),await e.dropTable("saved_queries",!0)}};0&&(module.exports={QueriesHistory1758316062697});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var s=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var b=(t,e)=>{for(var n in e)s(t,n,{get:e[n],enumerable:!0})},u=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of d(e))!l.call(t,a)&&a!==n&&s(t,a,{get:()=>e[a],enumerable:!(o=m(e,a))||o.enumerable});return t};var T=t=>u(s({},"__esModule",{value:!0}),t);var w={};b(w,{MultipleWorkbenches1760039807820:()=>c});module.exports=T(w);var r=require("typeorm");var i=process.env.APP_DB_TYPE==="sqlite"?"datetime":"timestamp";var c=class{name="MultipleWorkbenches1760039807820";async up(e){await e.createTable(new r.Table({name:"workbenches",columns:[{name:"id",type:"uuid",isPrimary:!0,isGenerated:!0,generationStrategy:"uuid"},{name:"createdAt",type:i,default:"CURRENT_TIMESTAMP"},{name:"updatedAt",type:i,default:"CURRENT_TIMESTAMP"},{name:"name",type:"varchar"},{name:"archived",type:"boolean",default:!1},{name:"teamId",type:"uuid",isNullable:!0},{name:"userId",type:"uuid",isNullable:!0}]}),!0),await e.createForeignKey("workbenches",new r.TableForeignKey({columnNames:["teamId"],referencedTableName:"teams",referencedColumnNames:["id"],onDelete:"SET NULL"})),await e.createForeignKey("workbenches",new r.TableForeignKey({columnNames:["userId"],referencedTableName:"users",referencedColumnNames:["id"],onDelete:"SET NULL"})),await e.createTable(new r.Table({name:"workbenchTabs",columns:[{name:"id",type:"uuid",isPrimary:!0,isGenerated:!0,generationStrategy:"uuid"},{name:"name",type:"varchar"},{name:"createdAt",type:i,default:"CURRENT_TIMESTAMP"},{name:"updatedAt",type:i,default:"CURRENT_TIMESTAMP"},{name:"workbenchId",type:"uuid",isNullable:!0},{name:"queryId",type:"uuid",isNullable:!0}]}),!0),await e.createForeignKey("workbenchTabs",new r.TableForeignKey({columnNames:["workbenchId"],referencedTableName:"workbenches",referencedColumnNames:["id"]})),await e.createForeignKey("workbenchTabs",new r.TableForeignKey({columnNames:["queryId"],referencedTableName:"queries",referencedColumnNames:["id"]}))}async down(e){let n=await e.getTable("workbenchTabs");if(n){for(let a of n.foreignKeys)await e.dropForeignKey("workbenchTabs",a);await e.dropTable("workbenchTabs")}let o=await e.getTable("workbenches");if(o){for(let a of o.foreignKeys)await e.dropForeignKey("workbenches",a);await e.dropTable("workbenches")}}};0&&(module.exports={MultipleWorkbenches1760039807820});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var t=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var o=Object.prototype.hasOwnProperty;var c=(r,e)=>{for(var n in e)t(r,n,{get:e[n],enumerable:!0})},b=(r,e,n,d)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of l(e))!o.call(r,s)&&s!==n&&t(r,s,{get:()=>e[s],enumerable:!(d=i(e,s))||d.enumerable});return r};var T=r=>b(t({},"__esModule",{value:!0}),r);var p={};c(p,{WorkbenchTabs1760816916693:()=>u});module.exports=T(p);var a=require("typeorm");var m=process.env.APP_DB_TYPE==="sqlite"?"datetime":"timestamp";var u=class{name="WorkbenchTabs1760816916693";async up(e){await e.createTable(new a.Table({name:"workbench_tabs",columns:[{name:"id",type:"uuid",isPrimary:!0,isGenerated:!0,generationStrategy:"uuid"},{name:"createdAt",type:m,default:"CURRENT_TIMESTAMP"},{name:"updatedAt",type:m,default:"CURRENT_TIMESTAMP"},{name:"name",type:"varchar"},{name:"archived",type:"boolean",isNullable:!1,default:!1},{name:"teamId",type:"uuid",isNullable:!1},{name:"queryId",type:"uuid",isNullable:!0},{name:"userId",type:"uuid",isNullable:!1},{name:"opts",type:"json",default:"'{}'"}]})),await e.createForeignKeys("saved_queries",[new a.TableForeignKey({columnNames:["teamId"],referencedTableName:"teams",referencedColumnNames:["id"]}),new a.TableForeignKey({columnNames:["userId"],referencedTableName:"users",referencedColumnNames:["id"]}),new a.TableForeignKey({columnNames:["queryId"],referencedTableName:"query",referencedColumnNames:["id"]})])}async down(e){await e.dropForeignKeys("workbench_tabs",[new a.TableForeignKey({columnNames:["teamId"],referencedTableName:"teams",referencedColumnNames:["id"]}),new a.TableForeignKey({columnNames:["userId"],referencedTableName:"users",referencedColumnNames:["id"]}),new a.TableForeignKey({columnNames:["queryId"],referencedTableName:"query",referencedColumnNames:["id"]})]),await e.dropTable("workbench_tabs",!0)}};0&&(module.exports={WorkbenchTabs1760816916693});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var i=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var T=(a,e)=>{for(var t in e)i(a,t,{get:e[t],enumerable:!0})},_=(a,e,t,u)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of b(e))!p.call(a,r)&&r!==t&&i(a,r,{get:()=>e[r],enumerable:!(u=l(e,r))||u.enumerable});return a};var w=a=>_(i({},"__esModule",{value:!0}),a);var S={};T(S,{LinkTabToDatasource1762376647080:()=>c});module.exports=w(S);var o=require("typeorm");var C=process.env.APP_DB_TYPE==="sqlite"?"datetime":"timestamp",s={WorkbenchTabs:"workbench_tabs",Teams:"teams",Users:"users",UsersToTeams:"users_to_teams",UserSettings:"user_settings",DataSources:"data_sources",Query:"query",DbInspection:"db_inspection",SavedQueries:"saved_queries"};var m=new o.TableForeignKey({columnNames:["dataSourceId"],referencedTableName:"data_sources",referencedColumnNames:["id"]}),d=new o.TableColumn({name:"dataSourceId",type:"uuid",isNullable:!0}),n=new o.TableColumn({name:"searchString",type:"varchar",isNullable:!0}),c=class{name="LinkTabToDatasource1762376647080";async up(e){await e.addColumns(s.WorkbenchTabs,[d,n]),await e.addColumns(s.SavedQueries,[n]),await e.createForeignKeys(s.WorkbenchTabs,[m])}async down(e){await e.dropForeignKeys(s.WorkbenchTabs,[m]),await e.dropColumns(s.WorkbenchTabs,[d,n]),await e.dropColumns(s.SavedQueries,[n])}};0&&(module.exports={LinkTabToDatasource1762376647080});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var i=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var S=(s,e)=>{for(var t in e)i(s,t,{get:e[t],enumerable:!0})},T=(s,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of _(e))!p.call(s,n)&&n!==t&&i(s,n,{get:()=>e[n],enumerable:!(o=b(e,n))||o.enumerable});return s};var u=s=>T(i({},"__esModule",{value:!0}),s);var l={};S(l,{AddSearchIndexes1762683837767:()=>c});module.exports=u(l);var r=require("typeorm");var E=process.env.APP_DB_TYPE==="sqlite"?"datetime":"timestamp",a={WorkbenchTabs:"workbench_tabs",Teams:"teams",Users:"users",UsersToTeams:"users_to_teams",UserSettings:"user_settings",DataSources:"data_sources",Query:"query",DbInspection:"db_inspection",SavedQueries:"saved_queries"};var m=new r.TableIndex({name:"IDX_WORKBENCH_SEARCH_STRING",columnNames:["searchString"]}),d=new r.TableIndex({name:"IDX_SAVED_QUERY_SEARCH_STRING",columnNames:["searchString"]}),I=new r.TableIndex({name:"IDX_TABLE_NAME",columnNames:["tableName"]}),c=class{name="AddSearchIndexes1762683837767";async up(e){await e.createIndices(a.WorkbenchTabs,[m]),await e.createIndices(a.SavedQueries,[d]),await e.createIndices(a.DbInspection,[I])}async down(e){await e.dropIndices(a.DbInspection,[I]),await e.dropIndices(a.SavedQueries,[d]),await e.dropIndices(a.WorkbenchTabs,[m])}};0&&(module.exports={AddSearchIndexes1762683837767});
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";var Vt=Object.create;var _e=Object.defineProperty;var zt=Object.getOwnPropertyDescriptor;var Jt=Object.getOwnPropertyNames;var Xt=Object.getPrototypeOf,Zt=Object.prototype.hasOwnProperty;var er=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of Jt(t))!Zt.call(e,a)&&a!==r&&_e(e,a,{get:()=>t[a],enumerable:!(o=zt(t,a))||o.enumerable});return e};var P=(e,t,r)=>(r=e!=null?Vt(Xt(e)):{},er(t||!e||!e.__esModule?_e(r,"default",{value:e,enumerable:!0}):r,e));var J=require("dotenv"),X=require("node:path"),De=require("node:fs"),tr=(()=>{try{let e=(0,De.readFileSync)((0,X.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(e)}catch{return{version:"0.0.0"}}})(),Ue=[];process.argv[2]&&Ue.push((0,X.resolve)(process.argv[2]));(0,J.config)({path:Ue});(0,J.populate)(process.env,{SERVER_VERSION:tr.version,APP_DB_TYPE:"sqlite",APP_DB_DATABASE:"<home>/.dataramen/.runtime/db.sqlite3",PROD:"true"},{override:!1});var rr=["SYMM_ENCRYPTION_KEY","JWT_SECRET","JWT_REFRESH_SECRET"],ve=()=>{let e=[];for(let t of rr)process.env[t]||e.push(t);if(e.length>0)throw new Error("Following env variables are required but not provided: "+e.join(", "))};function or(e,t=void 0){return process.env[e]||t}function ar(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 nr(e){return process.env[e]==="true"||process.env[e]==="TRUE"||process.env[e]==="1"}var p={str:or,num:ar,bool:nr};var Fs=require("reflect-metadata"),Bt=P(require("fastify")),Ft=P(require("@fastify/cors")),$t=P(require("@fastify/static")),Ht=P(require("qs"));var s=class extends Error{constructor(r,o){super(o);this.status=r;this.message=o}};var He=require("typeorm");var xe=require("typeorm");var d=p.str("APP_DB_TYPE")==="sqlite"?"datetime":"timestamp";var le=new xe.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:d,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:d,default:()=>"CURRENT_TIMESTAMP"}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var Me=require("typeorm");var de=new Me.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:d,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:d,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 Le=require("typeorm");var pe=new Le.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:d,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:d,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},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"user"}}});var ke=require("typeorm");var fe=new ke.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:d,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:d,default:()=>"CURRENT_TIMESTAMP"}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var qe=require("typeorm");var ye=new qe.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:d,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:d,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:d,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 We=P(require("node:os")),Ye=require("node:path");var Qe=require("typeorm");var Te=new Qe.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",default:"{}"},createdAt:{type:d,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:d,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},user:{type:"many-to-one",target:()=>"User",inverseSide:"queries",joinColumn:!0,nullable:!0}}});var Be=require("typeorm"),he=new Be.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"}}});var Fe=require("typeorm");var ge=new Fe.EntitySchema({name:"SavedQuery",tableName:"saved_queries",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},isPersonal:{type:Boolean},createdAt:{type:d,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:d,default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"},searchString:{type:String,default:()=>null}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"queries",joinColumn:!0},user:{type:"many-to-one",target:()=>"User",inverseSide:"queries",joinColumn:!0,nullable:!0},query:{type:"one-to-one",target:()=>"Query",joinColumn:!0,nullable:!1}}});var $e=require("typeorm");var we=new $e.EntitySchema({name:"WorkbenchTab",tableName:"workbench_tabs",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:d,default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:d,default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"},opts:{type:"json",default:"{}"},archived:{type:Boolean,default:!1},searchString:{type:String,default:()=>null}},relations:{team:{type:"many-to-one",target:()=>"Team",joinColumn:!0},user:{type:"many-to-one",target:()=>"User",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",joinColumn:!0}}});function sr(){let e=p.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>",We.default.homedir())),e}var S=new He.DataSource({type:p.str("APP_DB_TYPE"),database:sr(),host:p.str("APP_DB_HOST"),username:p.str("APP_DB_USERNAME"),password:p.str("APP_DB_PASSWORD"),port:p.num("APP_DB_PORT"),schema:p.str("APP_DB_SCHEMA"),logging:p.bool("APP_DB_LOGGING"),migrationsRun:!0,migrations:[Ye.posix.join(__dirname,"migrations","*.js")],entities:[le,ye,de,pe,he,fe,Te,ge,we]}),je=async()=>{if(!S.isInitialized)return S.initialize();throw new Error("Already initialized")},U=S.getRepository(le),E=S.getRepository(ye),x=S.getRepository(de),R=S.getRepository(pe),N=S.getRepository(he),B=S.getRepository(fe),C=S.getRepository(Te),M=S.getRepository(ge),_=S.getRepository(we);var T=e=>(t,r,o)=>{e(t),o()};var W=require("jose");var Ge=new TextEncoder,Ke=Ge.encode(p.str("JWT_SECRET")),Ve=Ge.encode(p.str("JWT_REFRESH_SECRET")),Se=async({userId:e})=>new W.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("1h").sign(Ke),Ee=async({userId:e})=>new W.SignJWT({sub:e}).setProtectedHeader({alg:"HS256"}).setExpirationTime("10d").sign(Ve),ze=async(e,t)=>{try{let{payload:r}=await(0,W.jwtVerify)(e,t);if(!r.sub)throw new s(401,"Failed to verify access token");return{userId:r.sub}}catch(r){throw r instanceof s?r:r instanceof Error?new s(401,r.message):new s(401,"Failed to verify refresh token")}},Je=async e=>ze(e,Ke),Xe=async e=>ze(e,Ve);var l=(e,t)=>{let r=e.body;return t&&t(r),r},F=(e,t)=>{let r=e.query;return t&&t(r),r},f=(e,t)=>{let r=e.params;return t&&t(r),r};var et=P(require("bcryptjs"));var Ze=e=>{if(!e?.username)throw new s(400,"Username is required");if(!e?.password)throw new s(400,"Password is required")};var Z="DATARAMEN_refresh_token",be={httpOnly:!0,secure:p.bool("PROD"),sameSite:p.bool("PROD"),path:"/",maxAge:10*24*60*60},tt=T(e=>{e.route({method:"post",url:"/login",config:{isPublic:!0},handler:async(t,r)=>{let{username:o,password:a}=l(t,Ze),n=await R.findOne({where:{username:o}});if(!n||!et.default.compareSync(a,n.password))throw new s(401,"Invalid credentials");let[i,u]=await Promise.all([Se({userId:n?.id}),Ee({userId:n?.id})]);return r.setCookie(Z,u,be),{data:{accessToken:i}}}}),e.route({method:"post",url:"/refresh",config:{isPublic:!0},handler:async(t,r)=>{let o=t.cookies[Z];if(!o)return r.code(401).send({message:"Missing refresh token"});let{userId:a}=await Xe(o),[n,i]=await Promise.all([Se({userId:a}),Ee({userId:a})]);return r.setCookie(Z,i,be),{data:{accessToken:n}}}}),e.route({method:"post",url:"/logout",config:{isPublic:!0},handler:async(t,r)=>(r.clearCookie(Z,be),{data:!0})})});var rt=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 at=P(require("mysql2/promise"));var ir=({database:e,password:t,user:r,url:o})=>at.default.createConnection({host:o,user:r,database:e,password:t}),ur=async e=>{let t=`
|
|
2
|
+
SELECT TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION
|
|
3
|
+
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
|
|
4
|
+
WHERE CONSTRAINT_NAME = 'PRIMARY'
|
|
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},cr=async e=>{let t=`
|
|
7
|
+
SELECT
|
|
8
|
+
TABLE_NAME AS table_name,
|
|
9
|
+
COLUMN_NAME AS field,
|
|
10
|
+
REFERENCED_TABLE_NAME AS referenced_table,
|
|
11
|
+
REFERENCED_COLUMN_NAME AS referenced_field
|
|
12
|
+
FROM
|
|
13
|
+
information_schema.KEY_COLUMN_USAGE
|
|
14
|
+
WHERE
|
|
15
|
+
REFERENCED_TABLE_NAME IS NOT NULL
|
|
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},mr=async(e,t)=>{let o=(await t.query("SHOW TABLES"))[0],a=await cr(t),n=await ur(t),i=o.map(async u=>{let y=Object.values(u)[0],m=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${e.database}' and table_name = '${y}'`,[w]=await t.query(m),I=a[y];return{columns:w.map(c=>({name:c.COLUMN_NAME,type:c.DATA_TYPE,isPrimary:n[y]?.includes(c.COLUMN_NAME),ref:I?.[c.COLUMN_NAME]?{table:I[c.COLUMN_NAME].refTable,field:I[c.COLUMN_NAME].refField}:void 0})).sort((c,h)=>c.isPrimary&&h.isPrimary?c.name.localeCompare(h.name):c.isPrimary?-1:1),createdAt:new Date,tableName:y,updatedAt:new Date}});return Promise.all(i)},ot=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)}},lr=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}},dr=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}},nt=async e=>{let t=await ir(e),r=!1;return{dbType:"mysql",dataSource:e,inspectSchema:()=>mr(e,t),executeQuery:(o,a)=>a.type==="SELECT"?dr(t,()=>ot(o,t,a)):lr(t,()=>ot(o,t,a)),checkConnection:async()=>t.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,t.destroy()}}};var it=P(require("pg"));var pr=async({database:e,password:t,user:r,url:o,port:a})=>{let n=new it.default.Client({host:o,user:r,database:e,password:t,port:a,query_timeout:1e4});return await n.connect(),n},fr=async e=>{let r=await e.query(`
|
|
18
|
+
SELECT
|
|
19
|
+
kcu.table_name,
|
|
20
|
+
kcu.column_name,
|
|
21
|
+
kcu.ordinal_position
|
|
22
|
+
FROM
|
|
23
|
+
information_schema.table_constraints tc
|
|
24
|
+
JOIN information_schema.key_column_usage kcu
|
|
25
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
26
|
+
AND tc.table_schema = kcu.table_schema
|
|
27
|
+
WHERE
|
|
28
|
+
tc.constraint_type = 'PRIMARY KEY'
|
|
29
|
+
ORDER BY
|
|
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},yr=async e=>{let r=await e.query(`
|
|
32
|
+
SELECT
|
|
33
|
+
tc.table_name AS table_name,
|
|
34
|
+
kcu.column_name AS field,
|
|
35
|
+
ccu.table_name AS referenced_table,
|
|
36
|
+
ccu.column_name AS referenced_field
|
|
37
|
+
FROM
|
|
38
|
+
information_schema.table_constraints AS tc
|
|
39
|
+
JOIN information_schema.key_column_usage AS kcu
|
|
40
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
41
|
+
AND tc.table_schema = kcu.table_schema
|
|
42
|
+
JOIN information_schema.constraint_column_usage AS ccu
|
|
43
|
+
ON ccu.constraint_name = tc.constraint_name
|
|
44
|
+
AND ccu.table_schema = tc.table_schema
|
|
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},Tr=async(e,t)=>{let r=`SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = '${e.schema}'`,a=(await t.query(r)).rows,n=await yr(t),i=await fr(t),u=a.map(async y=>{let m=Object.values(y)[0],w=`
|
|
47
|
+
SELECT column_name, data_type
|
|
48
|
+
FROM information_schema.columns
|
|
49
|
+
WHERE
|
|
50
|
+
table_name = '${m}' and
|
|
51
|
+
table_schema = '${e.schema}'
|
|
52
|
+
`,{rows:I}=await t.query(w),c=n[m];return{columns:I.map(h=>({name:h.column_name,type:h.data_type,isPrimary:i[m]?.includes(h.column_name),ref:c?.[h.column_name]?{table:c[h.column_name].refTable,field:c[h.column_name].refField}:void 0})).sort((h,Q)=>h.isPrimary&&Q.isPrimary?h.name.localeCompare(Q.name):h.isPrimary?-1:1),createdAt:new Date,tableName:m,updatedAt:new Date}});return Promise.all(u)},hr=async(e,t)=>{let r=`select relname, attname, concat(pg_class.oid, '-', attnum) as row_key
|
|
53
|
+
from pg_attribute
|
|
54
|
+
left join pg_class on pg_attribute.attrelid = pg_class.oid
|
|
55
|
+
where
|
|
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),{})},st=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(m=>`'${m.tableID}-${m.columnID}'`),y=await hr(u,t);return{columns:a.map(m=>{let w=y[`${m.tableID}-${m.columnID}`];return{column:w?.column||m.name,alias:m.name,table:w?.table||"",full:w?w.table+"."+w.column:m.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)}},gr=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}},wr=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}},ut=async e=>{let t=await pr(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:()=>Tr(e,t),executeQuery:(n,i)=>a(()=>i.type==="SELECT"?wr(t,()=>st(n,t,i)):gr(t,()=>st(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 nt(e);else if(t==="postgres")o=await ut(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 ee=P(require("node:crypto"));var ct="aes-256-gcm",Sr=12,mt=()=>{let e=p.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},Er=e=>{let t=ee.default.randomBytes(Sr),r=mt(),o=ee.default.createCipheriv(ct,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")}},br=({encrypted:e,iv:t,tag:r})=>{let o=mt(),a=ee.default.createDecipheriv(ct,o,Buffer.from(t,"hex"));a.setAuthTag(Buffer.from(r,"hex"));let n=a.update(e,"hex","utf8");return n+=a.final("utf8"),n},te={encrypt:Er,decrypt:br};var k=(e,t=!1)=>{if(t){let r=te.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 lt=[{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"}],Rr=lt.reduce((e,t)=>(e[t.value]=t.label,e),{}),na=lt.reduce((e,t)=>(e[t.label]=t.value,e),{}),$=e=>e.map(t=>({label:Rr[t],value:t})),sa=$(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),ia=$(["=","<>","LIKE","NOT LIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),ua=$(["=","<>","IS NULL","IS NOT NULL"]),ca=$(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),ma=$(["IS NULL","IS NOT NULL"]),la=$(["IN","NOT IN"]);var dt=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"];var da=["date","datetime","timestamp","timestamptz"].reduce((e,t)=>(e[t]=!0,e),{});var Re=e=>e.fn?e.distinct===!0?`${e.fn} distinct ${e.value}`:`${e.fn} ${e.value}`:e.value;var Ie={read_only:10,editor:20,admin:30,owner:40};var b=e=>{let t=Ie[e];return r=>Ie[r.currentTeamRole]>=t},pt=async e=>{let t=e.routeOptions.config.requireRole;if(t&&!t(e.user))throw new s(403,"You are not authorized to perform this action")};var ft=T(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=f(t),o=await E.findOne({where:{id:r}});if(!o)throw new s(404,"Data source not found");return{data:o}}}),e.route({method:"get",url:"/",handler:async t=>{let{teamId:r}=F(t);return{data:await E.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}}),e.route({url:"/",method:"post",config:{requireRole:b("admin")},handler:async t=>{let{teamId:r,ownerId:o,...a}=l(t,rt),n=E.create({...a,allowUpdate:!!a.allowUpdate,allowInsert:!!a.allowInsert,team:{id:r},owner:{id:o}}),i=await L(k(n),n.dbType,t);try{await i.checkConnection()}catch{throw new s(400,"Cannot connect to the database, please check datasource configuration")}let{tag:u,iv:y,encrypted:m}=te.encrypt(n.dbPassword);return n.dbPassword=m,n.dbPasswordIv=y,n.dbPasswordTag=u,{data:await E.save(n)}}}),e.route({method:"put",url:"/:id",config:{requireRole:b("admin")},handler:async t=>{let{id:r}=f(t),o=l(t),a=await E.findOneBy({id:r});if(!a)throw new s(404,"Data source not found");let n=E.merge(a,o);return await E.save(n),{data:n}}}),e.route({method:"delete",url:"/:id",config:{requireRole:b("admin")},handler:async(t,r)=>S.transaction(async()=>{let{id:o}=f(t);await Promise.all([U.delete({datasource:{id:o}}),C.delete({dataSource:{id:o}})]),await E.delete({id:o})})}),e.route({method:"post",url:"/:id/inspect",handler:async(t,r)=>{let{id:o}=f(t),a=await E.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 E.save(a);let i=await(await L(k(a,!0),a.dbType,t)).inspectSchema();await U.delete({datasource:{id:o}}),await U.insert(i.sort().map(u=>U.create({tableName:u.tableName,columns:u.columns,datasource:{id:o}}))),a.status="READY",a.lastInspected=new Date,await E.save(a)}}),e.route({method:"get",url:"/:id/inspections",handler:async t=>{let{id:r}=f(t);return{data:await U.find({where:{datasource:{id:r}}})}}})});var H=require("typeorm"),yt=T(e=>{e.route({method:"get",url:"/team/:teamId/datasources",handler:async t=>{let{teamId:r}=f(t);return{data:await E.find({where:{team:{id:r}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0,dbType:!0,description:!0,allowInsert:!0,allowUpdate:!0}})}}}),e.route({method:"get",url:"/team/:teamId/queries",handler:async t=>{let o=f(t).teamId||t.user.currentTeamId;return{data:(await M.find({where:[{isPersonal:!1,team:{id:o}},{isPersonal:!0,team:{id:o},user:{id:t.user.id}}],relations:{query:!0},select:{id:!0,query:{id:!0,name:!0,updatedAt:!0}}})).map(i=>({name:i.query.name,id:i.query.id,updatedAt:i.query.updatedAt,savedQueryId:i.id}))}}}),e.route({method:"get",url:"/team/:teamId/query",handler:async t=>{let{teamId:r}=f(t),{search:o,size:a,selectedDataSources:n}=F(t),i=o.length>3?parseInt(a)||20:8,u={};n?.length&&(u.id=(0,H.In)(n));let[y,m,w]=await Promise.all([U.find({where:{tableName:(0,H.Like)(`%${o}%`),datasource:u},relations:{datasource:!0},select:{id:!0,tableName:!0,updatedAt:!0,datasource:{name:!0,id:!0}},order:{updatedAt:"ASC"},take:i}),_.find({where:{searchString:(0,H.Like)(`%${o}%`),team:{id:r},user:{id:t.user.id},dataSource:u},relations:{dataSource:!0},select:{id:!0,name:!0,updatedAt:!0,dataSource:{id:!0,name:!0}},order:{updatedAt:"ASC"},take:i}),M.find({where:{searchString:(0,H.Like)(`%${o}%`),team:{id:r},query:{dataSource:u}},relations:{query:{dataSource:!0}},select:{id:!0,updatedAt:!0,query:{id:!0,name:!0,dataSource:{name:!0}}},order:{updatedAt:"ASC"},take:i})]),I=[];return y.forEach(c=>{I.push({name:c.tableName,id:c.id,dataSourceName:c.datasource?.name||"--",dataSourceId:c.datasource?.id||"--",type:"table"})}),m.forEach(c=>{I.push({name:c.name,id:c.id,dataSourceName:c.dataSource?.name||"--",dataSourceId:c.dataSource?.id||"--",type:"tab"})}),w.forEach(c=>{I.push({name:c.query.name,id:c.query.id,dataSourceName:c.query.dataSource?.name||"--",dataSourceId:c.query.dataSource?.id||"--",type:"query"})}),{data:I}}})});var Tt=T(e=>{e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=f(t),o=await C.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:b("editor")},handler:async t=>{let r=l(t),o=await E.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await C.save(C.create({name:r.name,opts:r.opts,team:{id:o?.team.id},dataSource:{id:r.dataSourceId},user:{id:t.user.id}}))}}}),e.route({method:"patch",url:"/:id",config:{requireRole:b("editor")},handler:async t=>{let{id:r}=f(t),o=l(t);if(!(await C.update(r,o)).affected)throw new s(404,"Query not found");return{data:await C.findOneBy({id:r})}}}),e.route({method:"delete",url:"/:id",config:{requireRole:b("editor")},handler:async t=>S.transaction(async()=>{let{id:r}=f(t);if(!(await C.delete({id:r})).affected)return{status:404,data:"Query not found"}})})});var re=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`},Y={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:re,MAX:re,MIN:re,COUNT:re};var oe=e=>{let t=e.distinct===!0?"distinct ":"";return`${e.fn}(${t}${e.value})`},j={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:oe,MAX:oe,MIN:oe,COUNT:oe};var ht=["SUM","COUNT","AVG","MAX","MIN"],Ir=["YEAR","MONTH","DAY",...ht],Cr=Ir.reduce((e,t)=>(e[t]=!0,e),{}),Nr=ht.reduce((e,t)=>(e[t]=!0,e),{}),ae=e=>Cr[e],gt=e=>Nr[e],wt=(e,t)=>e.fn&&ae(e.fn)?(t==="postgres"?Y:j)[e.fn](e):e.value;var ne=e=>typeof e=="string",St=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},G=(e,t)=>{let{column:r,operator:o,value:a,fn:n}=e,i=wt({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(c=>ne(c.value)?`'${c.value}'`:c.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 w=a?.[0],I;return ne(w?.value)&&w?.isColumn!==!0?I=`'${w?.value}'`:I=w?.value,`${i} ${o} ${I}`}};var se=class{constructor(t="mysql"){this.dialect=t,this.skeleton={type:"SELECT"}}addWhere(t){let r=G(t,this.dialect);if(t.isEnabled!==!1)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=G(t,this.dialect);if(t.isEnabled!==!1)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 St(this.skeleton)}};var bt=require("typeorm");var ie=async(e,t)=>{let{datasourceId:r,size:o=20,page:a,name:n}=t,{table:i,filters:u,joins:y,groupBy:m,searchAll:w,orderBy:I}=t.opts,c=Dr(t.opts.columns,t.opts.groupBy,t.opts.aggregations),h=await E.findOne({where:{id:r},select:["id","dbType","dbDatabase","dbPassword","dbPasswordTag","dbPasswordIv","dbPort","dbUrl","dbSchema","dbUser"]}),Q=[i],V=[];if(!h)throw new s(404,"Data source not found");let Gt=await C.save(C.create({user:{id:e.user.id},team:{id:e.user.currentTeamId},dataSource:{id:r},name:n,opts:t.opts})),O=new se(h.dbType);O.setTable(i),O.setLimit(o+1),O.setOffset(o*a),u?.forEach(g=>{g.fn&>(g.fn)?O.addHaving(g):O.addWhere(g)}),y&&(O.addJoin(...y),y.forEach(g=>{Q.push(g.table)}));let Oe=_r(c,I,h.dbType);Oe.length>0&&O.addOrderBy(...Oe),m&&m.length>0&&m.forEach(g=>O.addGroupBy(Pr(g,h.dbType)));let Kt=await U.find({where:{tableName:(0,bt.In)(Q),datasource:{id:r}}});for(let g of Kt)if(g.columns)for(let v of g.columns)V.push({column:v.name,table:g.tableName||"",full:`${g.tableName}.${v.name}`,type:v.type});let z;if(c&&c.length>0?z=c.map(g=>Or(g,h.dbType)):z=V.map(g=>`${g.full} as "${g.full}"`),O.selectColumns(z),w){let g=V.filter(v=>dt.includes(v.type)&&z.some(me=>me.startsWith(v.full)));if(g.length>0){let v=g.map(me=>`LOWER(${me.full}) LIKE '%${w.toLowerCase()}%'`);O.addWhereRaw(`(${v.join(" OR ")})`,"AND")}}let ce=await(await L(k(h,!0),h.dbType,e)).executeQuery(O.toSQL(),{type:"SELECT",allowBulkUpdate:!1}),Pe=ce.rows.length>o;return Pe&&ce.rows.pop(),{...ce,queryHistoryId:Gt.id,tables:Q,allColumns:V,hasMore:Pe}},Rt=async(e,t)=>{let r=await E.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:y})=>typeof u=="string"?u&&u.startsWith("=")?`${y}=${u.substring(1)}`:`${y}='${u}'`:`${y}='${u}'`).join(", "),a=t.filters.map(u=>G(u,r.dbType)).join(" AND "),n=`UPDATE ${t.table} SET ${o} WHERE ${a}`;return(await L(k(r,!0),r.dbType,e)).executeQuery(n,{type:"UPDATE",allowBulkUpdate:!1})},It=async(e,t)=>{let r=await E.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}=Ar(t.values),n=`INSERT INTO ${t.table} (${o}) VALUES (${a})`;return(await L(k(r,!0),r.dbType,e)).executeQuery(n,{type:"INSERT",allowBulkUpdate:!1})},Ar=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}},Or=(e,t)=>{if(e.fn){if(ae(e.fn))return`${(t==="postgres"?Y:j)[e.fn](e)} as "${Re(e)}"`;throw new Error("Function not allowed: "+e.fn)}return`${e.value} as "${e.value}"`},Pr=(e,t)=>{if(e.fn){if(ae(e.fn))return(t==="postgres"?Y:j)[e.fn]({...e,value:Et(e.value,t)});throw new Error("Function not allowed: "+e.fn)}return Et(e.value,t)},Ce=(e,t)=>t==="postgres"?`"${e}"`:t==="mysql"?`\`${e}\``:e,Et=(e,t)=>{let[r,o]=e.split(".");return Ce(r,t)+"."+Ce(o,t)},_r=(e,t,r)=>{if(e&&e.length>0){let o=e.reduce((a,n)=>(a.set(Re(n),{isFn:!!(n.fn||n.distinct)}),a),new Map);t=t.filter(a=>o.has(a.column)).map(a=>o.get(a.column)?.isFn?{...a,column:Ce(a.column,r)}:a)}return t},Dr=(e,t,r)=>{let o=[];return t.length>0||r.length>0?o.push(...t,...r):e.length>0&&o.push(...e),o};var Ct=e=>{},Ur=["--",";","DROP","drop"],Nt=e=>{if(ne(e.value)&&e.value.startsWith("=")){let t=e.value;Ur.forEach(r=>{if(t.includes(r))throw new s(400,"Invalid input value for "+e.column)})}},At=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(Nt)},Ot=e=>{if(!e.table)throw new s(400,"Table is required");e.values.forEach(Nt)};var Pt=T(e=>{e.route({method:"post",url:"/select",handler:async t=>{let r=l(t,Ct);return{data:await ie(t,r)}}}),e.route({method:"post",url:"/insert",config:{requireRole:b("editor")},handler:async t=>{let r=l(t,At);return{data:await It(t,r)}}}),e.route({method:"post",url:"/update",config:{requireRole:b("editor")},handler:async t=>{let r=l(t,Ot);return{data:await Rt(t,r)}}})});var _t=T(e=>{e.get("/",{config:{isPublic:!0}},async()=>({data:{active:!0,version:p.str("SERVER_VERSION")}}))});var Dt=T(e=>{e.route({method:"get",url:"/:id/users",handler:async t=>{let{id:r}=f(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:b("editor")},handler:async t=>S.transaction(async()=>{let r=t.user.id,o=l(t),a=R.create();a.id=r;let n=x.create(o);await x.save(n);let i=N.create({user:a,team:n});return await N.save(i),{data:n}})}),e.route({method:"patch",url:"/:id/user-role",config:{requireRole:b("admin")},handler:async t=>{let{id:r}=f(t),{role:o,userId:a}=l(t,({role:i})=>{if(i==="owner")throw new s(400,"Only one owner is allowed")});if((await N.findOneBy({user:{id:a},team:{id:r}}))?.role==="owner")throw new s(400,"Cannot change owner role");await N.update({user:{id:a},team:{id:r}},{role:o})}}),e.route({method:"delete",url:"/:id",config:{requireRole:b("admin")},handler:async t=>S.transaction(async()=>{let{id:r}=f(t),{userId:o}=F(t);if((await N.findOneBy({user:{id:o},team:{id:r}}))?.role==="owner")throw new s(400,"Cannot delete team owner");await R.update(o,{currentTeam:null}),await N.delete({user:{id:o},team:{id:r}}),await R.delete({id:o})})})});var Ne=P(require("bcryptjs")),K=async e=>{let t=await Ne.default.genSalt(10);return Ne.default.hash(e,t)};var Ut=T(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=l(t);if(o.password&&(o.password=await K(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:"/",config:{requireRole:b("admin")},handler:async t=>S.transaction(async()=>{let r=l(t),o=await K(r.password),a=await R.save(R.create({username:r.username,password:o})),n=await N.save(N.create({role:"read_only",team:{id:r.teamId},user:{id:a.id}}));await R.update(a.id,{currentTeam:{id:n.id}})})})});var vt=T(e=>{e.route({method:"get",url:"/",handler:async t=>{let r=t.user.id,o=await B.findOneBy({user:{id:r}});return o||(o=await B.save(B.create({user:{id:r}}))),{data:o}}}),e.route({method:"patch",url:"/",handler:async t=>{let{settings:r}=l(t);if(!r.id)throw new s(400,"Settings id is required!");if(!(await B.update(r.id,r)).affected)throw new s(404,"You do not own these settings!");return{data:await B.findOneBy({id:r.id})}}})});function ue(e,...t){let r=[...t];e.searchAll&&r.push(e.searchAll);for(let o of e.filters)if(o.value)for(let a of o.value)a.value&&r.push(a.value.toString());return r.map(o=>o.toLowerCase()).join(",")}var xt=T(e=>{e.route({method:"post",url:"/",config:{requireRole:b("editor")},handler:async t=>{let r=l(t),o=await C.findOne({where:{id:r.queryId}});if(!o)throw new s(400,"Query not found");let a=await M.save(M.create({isPersonal:!1,team:{id:t.user.currentTeamId},user:{id:t.user.id},query:{id:r.queryId},searchString:ue(o.opts,r.name)}));return await C.update(r.queryId,{name:r.name}),{data:a}}}),e.route({method:"delete",url:"/:id",config:{requireRole:b("editor")},handler:async t=>{let{id:r}=f(t);if(!(await M.delete({id:r})).affected)return{status:404,data:"Query not found"}}})});var Mt=e=>{if(!e.queryId&&!(e.opts&&e.name))throw new s(400,"Either queryId or name and opts are required")};var Lt=T(e=>{e.route({method:"get",url:"/",handler:async t=>{let{currentTeamId:r,id:o}=t.user;return{data:(await _.find({where:{team:{id:r},user:{id:o},archived:!1},select:["id","name"]})).map(n=>({name:n.name,id:n.id}))}}}),e.route({method:"get",url:"/:id",handler:async t=>{let{id:r}=f(t),{currentTeamId:o,id:a}=t.user,n=await _.findOne({where:{id:r,team:{id:o},user:{id:a}}});if(!n)throw new s(404,"Not Found");return{data:n}}}),e.route({method:"post",url:"/",handler:async t=>{let{opts:r,name:o,queryId:a}=l(t,Mt),n,i,u=o;if(r)i=r.dataSourceId,n=r;else{let m=await C.findOne({where:{id:a},relations:{dataSource:!0}});if(!m)throw new s(404,"Query not Found");i=m.dataSource.id,n={table:m.opts.table,filters:m.opts.filters,joins:m.opts.joins,orderBy:m.opts.orderBy,columns:m.opts.columns,groupBy:m.opts.groupBy,searchAll:m.opts.searchAll,aggregations:m.opts.aggregations,dataSourceId:m.dataSource.id,page:0,size:50},o||(u=m.name)}return{data:await _.save(_.create({name:u||new Date().toISOString(),opts:n,dataSource:{id:i},user:{id:t.user.id},team:{id:t.user.currentTeamId}}))}}}),e.route({method:"post",url:"/:id/run",handler:async t=>{let{id:r}=f(t),o=l(t),a=await _.findOne({where:{id:r},relations:{user:!0}});if(!a)throw new s(404,"Not found");if(a.user?.id!==t.user.id)throw new s(404,"Not found");return o&&_.update(r,{opts:o,searchString:ue(o,a.name)}),{data:{result:await ie(t,{datasourceId:o.dataSourceId,size:o.size,name:a.name,page:o.page,opts:{table:o.table,filters:o.filters,joins:o.joins,orderBy:o.orderBy,columns:o.columns,groupBy:o.groupBy,searchAll:o.searchAll,aggregations:o.aggregations}})}}}}),e.route({method:"patch",url:"/:id",handler:async t=>{let{id:r}=f(t),o=l(t);if(!await _.findOne({where:{id:r,user:{id:t.user.id}}}))throw new s(404,"Not Found");return await _.update(r,o),{data:{id:r}}}})});var Wt=require("node:path");var vr=e=>e.routeOptions.config.isPublic?!0:!e.url.startsWith("/api/"),kt=async e=>{if(vr(e))return;let t=e.headers.authorization;if(!t)throw new s(401,"Missing auth token");let[r,o]=t.split(" ");try{let{userId:a}=await Je(o),n=await R.findOne({where:{id:a},select:{id:!0,currentTeam:{role:!0,team:{id:!0}}},relations:{currentTeam:{team:!0}}});if(!n)throw new s(401,"User is not part of a team");e.user={id:a,currentTeamId:n.currentTeam.team.id,currentTeamRole:n.currentTeam.role}}catch{throw new s(401,"Unauthorized")}};var qt=(e,t)=>{e.__connections&&e.__connections.forEach(r=>{r.close()})};var Yt=P(require("@fastify/cookie"));var Ae={teamName:"Default Team",username:"admin",password:"admin"},xr=async()=>{let e=await x.findOneBy({});return e||x.save(x.create({name:Ae.teamName}))},Qt=async()=>{let e=await N.findOne({where:{role:"owner"},relations:{user:!0}});if(e)return e.user;let t=await xr(),r=await K(Ae.password),o=await R.save(R.create({username:Ae.username,password:r})),a=await N.save(N.create({user:o,team:t,role:"owner"}));return await R.update(o.id,{currentTeam:a}),o};var A=(0,Bt.default)({querystringParser:e=>Ht.default.parse(e)}),jt=p.num("PORT",4466),Mr=p.str("ALLOWED_ORIGINS","").split(",").map(e=>e.trim()),Lr="0.0.0.0",kr=[`http://localhost:${jt}`,...Mr];function D(e,t){A.register(e,{prefix:t}),console.log("Registered "+t)}(async function(){ve(),await A.register(Yt.default,{}),await A.register(Ft.default,{origin:(t,r)=>{!t||kr.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($t.default,{root:(0,Wt.join)(__dirname,"web")}),A.get("/",(t,r)=>{r.sendFile("index.html")}),A.addHook("onRequest",kt),A.addHook("onRequest",pt),A.addHook("onResponse",qt),D(tt,"/api/auth"),D(ft,"/api/data-sources"),D(yt,"/api/project"),D(Tt,"/api/queries"),D(Pt,"/api/runner"),D(_t,"/api/status"),D(Dt,"/api/teams"),D(Ut,"/api/users"),D(vt,"/api/user-settings"),D(xt,"/api/saved-queries"),D(Lt,"/api/workbench-tabs"),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 je(),await Qt(),A.listen({port:jt,host:Lr},(t,r)=>{t&&(console.error(t),process.exit(1)),console.log(`Server listening at ${r}`)})})();
|