@dataramen/cli 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/run.js +52 -9
- package/dist/code/cli.js +135 -0
- package/dist/code/proxy.js +1 -1
- package/dist/code/register.windows.js +44 -0
- package/dist/env/.env.default +1 -1
- package/dist/package.json +1 -1
- package/package.json +1 -2
package/bin/run.js
CHANGED
|
@@ -6,10 +6,13 @@ const yargsHelpers = require("yargs/helpers");
|
|
|
6
6
|
const os = require('node:os');
|
|
7
7
|
const fs = require("fs-extra");
|
|
8
8
|
|
|
9
|
-
const processName = "@
|
|
9
|
+
const processName = "@dataramen/local-server";
|
|
10
10
|
|
|
11
11
|
const homeDir = os.homedir();
|
|
12
|
-
const filesPath = path.join(homeDir, ".
|
|
12
|
+
const filesPath = path.join(homeDir, ".dataramen", ".runtime", "server");
|
|
13
|
+
|
|
14
|
+
const scriptPkg = fs.readJsonSync(path.join(__dirname, "..", "package.json"));
|
|
15
|
+
const protocol = "dataramen://";
|
|
13
16
|
|
|
14
17
|
yargs()
|
|
15
18
|
.command("start", 'Default command, start/restart the server', () => {
|
|
@@ -30,7 +33,26 @@ yargs()
|
|
|
30
33
|
stdio: "inherit",
|
|
31
34
|
})
|
|
32
35
|
})
|
|
33
|
-
.
|
|
36
|
+
.command("unregister", "Unregister custom protocol handler", () => {
|
|
37
|
+
if (os.platform() === "win32") {
|
|
38
|
+
require(path.join(__dirname, "..", "dist", "code", "register.windows.js")).unregister();
|
|
39
|
+
}
|
|
40
|
+
})
|
|
41
|
+
.parse(isBrowserStart() ? getBrowserArgs() : yargsHelpers.hideBin(process.argv));
|
|
42
|
+
|
|
43
|
+
function isInstallation () {
|
|
44
|
+
return scriptPkg.name === "@dataramen/cli";
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function isBrowserStart () {
|
|
48
|
+
return !!process.argv[2]?.startsWith(protocol);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function getBrowserArgs () {
|
|
52
|
+
const str = (process.argv[2] || '').replace(protocol, ''); // remove protocol
|
|
53
|
+
console.log("Browser args", str.split("/"));
|
|
54
|
+
return str.split("/");
|
|
55
|
+
}
|
|
34
56
|
|
|
35
57
|
function checkPm2 () {
|
|
36
58
|
try {
|
|
@@ -58,6 +80,18 @@ function stopExisting () {
|
|
|
58
80
|
} catch (e) {}
|
|
59
81
|
}
|
|
60
82
|
|
|
83
|
+
function registerServer () {
|
|
84
|
+
try {
|
|
85
|
+
if (os.platform() === "win32") {
|
|
86
|
+
require(path.join(__dirname, "..", "dist", "code", "register.windows.js")).register();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
console.log("Custom protocol handler registered");
|
|
90
|
+
} catch (e) {
|
|
91
|
+
console.log("Failed to register server", e);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
61
95
|
function installServer () {
|
|
62
96
|
console.log("Installing Server");
|
|
63
97
|
// copy code
|
|
@@ -67,25 +101,34 @@ function installServer () {
|
|
|
67
101
|
// copy package.json
|
|
68
102
|
fs.copySync(path.join(__dirname, '..', 'dist', "package.json"), path.join(filesPath, "package.json"));
|
|
69
103
|
|
|
70
|
-
execSync(`npm i
|
|
104
|
+
execSync(`npm i`, {
|
|
71
105
|
stdio: "inherit",
|
|
72
106
|
cwd: filesPath,
|
|
73
107
|
});
|
|
74
108
|
console.log("Server installed");
|
|
109
|
+
|
|
110
|
+
registerServer();
|
|
75
111
|
}
|
|
76
112
|
|
|
77
113
|
function start () {
|
|
78
114
|
stopExisting();
|
|
79
115
|
|
|
80
116
|
try {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
117
|
+
if (isInstallation()) {
|
|
118
|
+
// only install if script is running from @dataramen/cli package
|
|
119
|
+
// if not, it means it was already installed, and the script is running from within the server folder
|
|
120
|
+
installServer();
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
console.log("Starting local server");
|
|
124
|
+
const appPkg = fs.readJsonSync(path.join(filesPath, "package.json"));
|
|
125
|
+
execSync(`pm2 start "${appPkg.main}" --name "${processName}" --no-autorestart`, {
|
|
85
126
|
stdio: "inherit",
|
|
86
127
|
cwd: filesPath,
|
|
87
128
|
});
|
|
88
|
-
|
|
129
|
+
|
|
130
|
+
console.log(`Local server will be available in a couple of seconds`);
|
|
131
|
+
console.log(`You can close this window`);
|
|
89
132
|
} catch (e) {
|
|
90
133
|
console.error(`Failed to start local server`, e);
|
|
91
134
|
}
|
package/dist/code/cli.js
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
const { execSync } = require("node:child_process");
|
|
3
|
+
const path = require("node:path");
|
|
4
|
+
const yargs = require("yargs");
|
|
5
|
+
const yargsHelpers = require("yargs/helpers");
|
|
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
|
+
const scriptPkg = fs.readJsonSync(path.join(__dirname, "..", "package.json"));
|
|
15
|
+
const protocol = "dataramen://";
|
|
16
|
+
|
|
17
|
+
yargs()
|
|
18
|
+
.command("start", 'Default command, start/restart the server', () => {
|
|
19
|
+
const hasPm2 = checkPm2();
|
|
20
|
+
if (!hasPm2) {
|
|
21
|
+
installPm2();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
start();
|
|
25
|
+
})
|
|
26
|
+
.command("logs", 'Listen for logs', () => {
|
|
27
|
+
execSync(`pm2 logs ${processName}`, {
|
|
28
|
+
stdio: "inherit",
|
|
29
|
+
});
|
|
30
|
+
})
|
|
31
|
+
.command("stop", 'Stop the server', () => {
|
|
32
|
+
execSync(`pm2 stop ${processName}`, {
|
|
33
|
+
stdio: "inherit",
|
|
34
|
+
})
|
|
35
|
+
})
|
|
36
|
+
.command("unregister", "Unregister custom protocol handler", () => {
|
|
37
|
+
if (os.platform() === "win32") {
|
|
38
|
+
require(path.join(__dirname, "..", "dist", "code", "register.windows.js")).unregister();
|
|
39
|
+
}
|
|
40
|
+
})
|
|
41
|
+
.parse(isBrowserStart() ? getBrowserArgs() : yargsHelpers.hideBin(process.argv));
|
|
42
|
+
|
|
43
|
+
function isInstallation () {
|
|
44
|
+
return scriptPkg.name === "@dataramen/cli";
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function isBrowserStart () {
|
|
48
|
+
return !!process.argv[2]?.startsWith(protocol);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function getBrowserArgs () {
|
|
52
|
+
const str = (process.argv[2] || '').replace(protocol, ''); // remove protocol
|
|
53
|
+
console.log("Browser args", str.split("/"));
|
|
54
|
+
return str.split("/");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function checkPm2 () {
|
|
58
|
+
try {
|
|
59
|
+
execSync(`pm2 -v`, {
|
|
60
|
+
stdio: "inherit"
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
return true;
|
|
64
|
+
} catch (e) {
|
|
65
|
+
console.error("Library does not exist");
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function installPm2 () {
|
|
71
|
+
console.log("Install Pm2");
|
|
72
|
+
execSync(`npm i -g pm2`, {
|
|
73
|
+
stdio: "inherit"
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function stopExisting () {
|
|
78
|
+
try {
|
|
79
|
+
execSync(`pm2 stop "${processName}"`);
|
|
80
|
+
} catch (e) {}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function registerServer () {
|
|
84
|
+
try {
|
|
85
|
+
if (os.platform() === "win32") {
|
|
86
|
+
require(path.join(__dirname, "..", "dist", "code", "register.windows.js")).register();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
console.log("Custom protocol handler registered");
|
|
90
|
+
} catch (e) {
|
|
91
|
+
console.log("Failed to register server", e);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function installServer () {
|
|
96
|
+
console.log("Installing Server");
|
|
97
|
+
// copy code
|
|
98
|
+
fs.copySync(path.join(__dirname, '..', 'dist', "code"), path.join(filesPath, "code"));
|
|
99
|
+
// copy default env (do not override existing .env)
|
|
100
|
+
fs.copySync(path.join(__dirname, '..', 'dist', "env", ".env.default"), path.join(filesPath, "env", ".env.default"));
|
|
101
|
+
// copy package.json
|
|
102
|
+
fs.copySync(path.join(__dirname, '..', 'dist', "package.json"), path.join(filesPath, "package.json"));
|
|
103
|
+
|
|
104
|
+
execSync(`npm i`, {
|
|
105
|
+
stdio: "inherit",
|
|
106
|
+
cwd: filesPath,
|
|
107
|
+
});
|
|
108
|
+
console.log("Server installed");
|
|
109
|
+
|
|
110
|
+
registerServer();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function start () {
|
|
114
|
+
stopExisting();
|
|
115
|
+
|
|
116
|
+
try {
|
|
117
|
+
if (isInstallation()) {
|
|
118
|
+
// only install if script is running from @dataramen/cli package
|
|
119
|
+
// if not, it means it was already installed, and the script is running from within the server folder
|
|
120
|
+
installServer();
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
console.log("Starting local server");
|
|
124
|
+
const appPkg = fs.readJsonSync(path.join(filesPath, "package.json"));
|
|
125
|
+
execSync(`pm2 start "${appPkg.main}" --name "${processName}" --no-autorestart`, {
|
|
126
|
+
stdio: "inherit",
|
|
127
|
+
cwd: filesPath,
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
console.log(`Local server will be available in a couple of seconds`);
|
|
131
|
+
console.log(`You can close this window`);
|
|
132
|
+
} catch (e) {
|
|
133
|
+
console.error(`Failed to start local server`, e);
|
|
134
|
+
}
|
|
135
|
+
}
|
package/dist/code/proxy.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var tt=Object.create;var ae=Object.defineProperty;var rt=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var st=Object.getPrototypeOf,ot=Object.prototype.hasOwnProperty;var H=(a,e)=>()=>(e||a((e={exports:{}}).exports,e),e.exports);var nt=(a,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of at(e))!ot.call(a,s)&&s!==t&&ae(a,s,{get:()=>e[s],enumerable:!(r=rt(e,s))||r.enumerable});return a};var A=(a,e,t)=>(t=a!=null?tt(st(a)):{},nt(e||!a||!a.__esModule?ae(t,"default",{value:a,enumerable:!0}):t,a));var De=H(_e=>{"use strict";Object.defineProperty(_e,"__esModule",{value:!0})});var Oe=H(O=>{"use strict";Object.defineProperty(O,"__esModule",{value:!0});O.SQLManipulator=O.SQLBuilder=O.SQLParser=void 0;var j=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 m=o[1].trim();t.columns=m==="*"?["*"]:this.parseColumns(m)}let n=r.match(/FROM\s+([^\s]+)(?:\s|$)/i);if(n&&(t.table=n[1]),!t.table){let m=r.match(/FROM\s+([^\s]+)(?:\s+(?:AS\s+)?([^\s]+))?(?:\s+(?:WHERE|JOIN|INNER|LEFT|RIGHT|FULL|GROUP|ORDER|LIMIT|OFFSET|HAVING)|$)/i);m&&(t.table=m[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 d=r.match(/GROUP\s+BY\s+(.*?)(?:\s+HAVING|\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/i);d&&(t.groupBy=this.parseColumns(d[1]));let l=r.match(/HAVING\s+(.*?)(?:\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/i);l&&(t.having=this.restoreSubqueries(l[1].trim(),s));let T=r.match(/LIMIT\s+(\d+)/i);T&&(t.limit=parseInt(T[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 d=`__SUBQUERY_${s}__`;return t.set(d,u),s++,n=!0,d}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+/),d=i[0],l=i.length>1?i[1]:void 0,T;o.includes("LEFT")?T="LEFT":o.includes("RIGHT")?T="RIGHT":o.includes("FULL")?T="FULL":T="INNER",t.push({type:T,table:d,alias:l,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}};O.SQLParser=j;var F=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}};O.SQLBuilder=F;var te=class{constructor(e,t="mysql"){this.dialect=t,this.parser=new j(t),this.parsed=this.parser.parse(e),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}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 F(this.parsed,this.dialect).build();return e&&(s=this.substituteParameters(s)),t&&(s+=";"),s}toParameterizedSQL(e=!1){let r=new F(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=>typeof i=="string"?`'${i}'`:i).join(", ");return`${t} ${r} (${o})`;default:let n=s?.[0],u=typeof n=="string"?`'${n}'`:n;return`${t} ${r} ${u}`}}};O.SQLManipulator=te});var re=H(N=>{"use strict";var Rt=N&&N.__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]}),Ne=N&&N.__exportStar||function(a,e){for(var t in a)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&Rt(e,a,t)};Object.defineProperty(N,"__esModule",{value:!0});Ne(De(),N);Ne(Oe(),N)});var $=require("dotenv"),Q=require("node:path"),se=require("node:fs"),it=(()=>{try{let a=(0,se.readFileSync)((0,Q.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(a)}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=A(require("fastify")),Ze=A(require("@fastify/cors"));var c=class extends Error{constructor(t,r){super(r);this.status=t;this.message=r}};var me=require("typeorm");var oe=require("typeorm"),Y=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"),G=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 ie=require("typeorm"),V=new ie.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:"datetime",default:"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:"CURRENT_TIMESTAMP"}},relations:{teams:{type:"many-to-many",target:()=>"Team",inverseSide:"users",joinTable:!0},settings:{type:"one-to-one",target:()=>"UserSettings",inverseSide:"user",joinColumn:!0},currentTeam:{type:"many-to-one",target:()=>"Team",joinColumn:!0}}});var ce=require("typeorm"),z=new ce.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"),J=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 de=require("typeorm"),K=new de.EntitySchema({name:"DataSource",tableName:"data_sources",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},dbUrl:{type:String},dbPort:{type:Number,nullable:!0},dbUser:{type:String},dbPassword:{type:String,nullable:!0},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 le=A(require("os"));var pe=require("typeorm"),Z=new pe.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},path:{type:"uuid",generated:"uuid"},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 ct(){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>",le.default.homedir())),a}var w=new me.DataSource({type:process.env.TYPEORM_CONNECTION,database:ct(),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:[Y,K,G,V,z,J,Z]}),fe=async()=>{if(!w.isInitialized)return w.initialize();throw new Error("Already initialized")},P=w.getRepository(Y),g=w.getRepository(K),k=w.getRepository(G),I=w.getRepository(V),_=w.getRepository(z),b=w.getRepository(J),S=w.getRepository(Z);var x=A(require("node:fs/promises")),X=require("node:path"),ye=A(require("node:os")),ut=ye.default.homedir(),ee=(0,X.join)(ut,".odemian",".runtime","files"),he=a=>(0,X.join)(ee,a),B=async a=>x.default.readFile(he(a),{encoding:"utf8"}),v=async(a,e)=>x.default.writeFile(he(a),e,{encoding:"utf8"});var ge=async()=>{await dt()||await x.default.mkdir(ee,{recursive:!0})};async function dt(){try{return(await x.default.lstat(ee)).isDirectory()}catch{return!1}}var h=a=>(e,t,r)=>{a(e),r()};var Te=h(a=>{a.post("/workbook",async e=>({data:""}))});var f=(a,e)=>{let t=a.body;return e&&e(t),t},M=(a,e)=>{let t=a.query;return e&&e(t),t},y=(a,e)=>{let t=a.params;return e&&e(t),t};var D=a=>a.headers["phoenix-user-id"];var we=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 Se=A(require("mysql2/promise"));var mt=({dbDatabase:a,dbPassword:e,dbUser:t,dbUrl:r})=>Se.default.createConnection({host:r,user:t,database:a,password:e}),lt=async a=>{let e=`
|
|
1
|
+
"use strict";var tt=Object.create;var ae=Object.defineProperty;var rt=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var st=Object.getPrototypeOf,ot=Object.prototype.hasOwnProperty;var H=(a,e)=>()=>(e||a((e={exports:{}}).exports,e),e.exports);var nt=(a,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of at(e))!ot.call(a,s)&&s!==t&&ae(a,s,{get:()=>e[s],enumerable:!(r=rt(e,s))||r.enumerable});return a};var A=(a,e,t)=>(t=a!=null?tt(st(a)):{},nt(e||!a||!a.__esModule?ae(t,"default",{value:a,enumerable:!0}):t,a));var De=H(_e=>{"use strict";Object.defineProperty(_e,"__esModule",{value:!0})});var Oe=H(O=>{"use strict";Object.defineProperty(O,"__esModule",{value:!0});O.SQLManipulator=O.SQLBuilder=O.SQLParser=void 0;var j=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 m=o[1].trim();t.columns=m==="*"?["*"]:this.parseColumns(m)}let n=r.match(/FROM\s+([^\s]+)(?:\s|$)/i);if(n&&(t.table=n[1]),!t.table){let m=r.match(/FROM\s+([^\s]+)(?:\s+(?:AS\s+)?([^\s]+))?(?:\s+(?:WHERE|JOIN|INNER|LEFT|RIGHT|FULL|GROUP|ORDER|LIMIT|OFFSET|HAVING)|$)/i);m&&(t.table=m[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 d=r.match(/GROUP\s+BY\s+(.*?)(?:\s+HAVING|\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/i);d&&(t.groupBy=this.parseColumns(d[1]));let l=r.match(/HAVING\s+(.*?)(?:\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/i);l&&(t.having=this.restoreSubqueries(l[1].trim(),s));let T=r.match(/LIMIT\s+(\d+)/i);T&&(t.limit=parseInt(T[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 d=`__SUBQUERY_${s}__`;return t.set(d,u),s++,n=!0,d}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+/),d=i[0],l=i.length>1?i[1]:void 0,T;o.includes("LEFT")?T="LEFT":o.includes("RIGHT")?T="RIGHT":o.includes("FULL")?T="FULL":T="INNER",t.push({type:T,table:d,alias:l,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}};O.SQLParser=j;var F=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}};O.SQLBuilder=F;var te=class{constructor(e,t="mysql"){this.dialect=t,this.parser=new j(t),this.parsed=this.parser.parse(e),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}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 F(this.parsed,this.dialect).build();return e&&(s=this.substituteParameters(s)),t&&(s+=";"),s}toParameterizedSQL(e=!1){let r=new F(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=>typeof i=="string"?`'${i}'`:i).join(", ");return`${t} ${r} (${o})`;default:let n=s?.[0],u=typeof n=="string"?`'${n}'`:n;return`${t} ${r} ${u}`}}};O.SQLManipulator=te});var re=H(N=>{"use strict";var Rt=N&&N.__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]}),Ne=N&&N.__exportStar||function(a,e){for(var t in a)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&Rt(e,a,t)};Object.defineProperty(N,"__esModule",{value:!0});Ne(De(),N);Ne(Oe(),N)});var $=require("dotenv"),Q=require("node:path"),se=require("node:fs"),it=(()=>{try{let a=(0,se.readFileSync)((0,Q.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(a)}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=A(require("fastify")),Ze=A(require("@fastify/cors"));var c=class extends Error{constructor(t,r){super(r);this.status=t;this.message=r}};var me=require("typeorm");var oe=require("typeorm"),Y=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"),G=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 ie=require("typeorm"),V=new ie.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:"datetime",default:"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:"CURRENT_TIMESTAMP"}},relations:{teams:{type:"many-to-many",target:()=>"Team",inverseSide:"users",joinTable:!0},settings:{type:"one-to-one",target:()=>"UserSettings",inverseSide:"user",joinColumn:!0},currentTeam:{type:"many-to-one",target:()=>"Team",joinColumn:!0}}});var ce=require("typeorm"),z=new ce.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"),J=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 de=require("typeorm"),K=new de.EntitySchema({name:"DataSource",tableName:"data_sources",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},dbUrl:{type:String},dbPort:{type:Number,nullable:!0},dbUser:{type:String},dbPassword:{type:String,nullable:!0},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 le=A(require("os"));var pe=require("typeorm"),Z=new pe.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},path:{type:"uuid",generated:"uuid"},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 ct(){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>",le.default.homedir())),a}var w=new me.DataSource({type:process.env.TYPEORM_CONNECTION,database:ct(),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:[Y,K,G,V,z,J,Z]}),fe=async()=>{if(!w.isInitialized)return w.initialize();throw new Error("Already initialized")},P=w.getRepository(Y),g=w.getRepository(K),k=w.getRepository(G),I=w.getRepository(V),_=w.getRepository(z),b=w.getRepository(J),S=w.getRepository(Z);var x=A(require("node:fs/promises")),X=require("node:path"),ye=A(require("node:os")),ut=ye.default.homedir(),ee=(0,X.join)(ut,".dataramen",".runtime","files"),he=a=>(0,X.join)(ee,a),B=async a=>x.default.readFile(he(a),{encoding:"utf8"}),v=async(a,e)=>x.default.writeFile(he(a),e,{encoding:"utf8"});var ge=async()=>{await dt()||await x.default.mkdir(ee,{recursive:!0})};async function dt(){try{return(await x.default.lstat(ee)).isDirectory()}catch{return!1}}var h=a=>(e,t,r)=>{a(e),r()};var Te=h(a=>{a.post("/workbook",async e=>({data:""}))});var f=(a,e)=>{let t=a.body;return e&&e(t),t},M=(a,e)=>{let t=a.query;return e&&e(t),t},y=(a,e)=>{let t=a.params;return e&&e(t),t};var D=a=>a.headers["phoenix-user-id"];var we=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 Se=A(require("mysql2/promise"));var mt=({dbDatabase:a,dbPassword:e,dbUser:t,dbUrl:r})=>Se.default.createConnection({host:r,user:t,database:a,password:e}),lt=async a=>{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'
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const os = require("node:os");
|
|
2
|
+
const path = require("node:path");
|
|
3
|
+
const { execSync } = require("node:child_process");
|
|
4
|
+
|
|
5
|
+
const homeDir = os.homedir();
|
|
6
|
+
const filesPath = path.join(homeDir, ".dataramen", ".runtime", "server");
|
|
7
|
+
const scriptPath = path.join(filesPath, "code", "cli.js");
|
|
8
|
+
|
|
9
|
+
const protocol = "dataramen";
|
|
10
|
+
|
|
11
|
+
function register () {
|
|
12
|
+
// Registry command (uses reg.exe)
|
|
13
|
+
const regCommands = [
|
|
14
|
+
`reg add "HKCU\\Software\\Classes\\${protocol}" /ve /d "Data Ramen" /f`,
|
|
15
|
+
`reg add "HKCU\\Software\\Classes\\${protocol}" /v "URL Protocol" /d "" /f`,
|
|
16
|
+
`reg add "HKCU\\Software\\Classes\\${protocol}\\shell\\open\\command" /ve /d "\\"C:\\\\Windows\\\\System32\\\\cmd.exe\\" /c node \\"${scriptPath}\\" \\"%1\\"" /f`
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
for (const cmd of regCommands) {
|
|
21
|
+
execSync(cmd, { stdio: "inherit" });
|
|
22
|
+
}
|
|
23
|
+
console.log(`Custom protocol '${protocol}://' registered to run: node ${scriptPath}`);
|
|
24
|
+
} catch (err) {
|
|
25
|
+
console.error("Failed to register protocol. Try running this script as Administrator.");
|
|
26
|
+
console.error(err.message);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function unregister () {
|
|
31
|
+
try {
|
|
32
|
+
// Delete the custom protocol registry key
|
|
33
|
+
execSync(`reg delete "HKCU\\Software\\Classes\\${protocol}" /f`, { stdio: "inherit" });
|
|
34
|
+
console.log(`Protocol '${protocol}://' successfully unregistered.`);
|
|
35
|
+
} catch (err) {
|
|
36
|
+
console.error(`Failed to unregister protocol '${protocol}://'. Try running as Administrator if needed.`);
|
|
37
|
+
console.error(err.message);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
module.exports = {
|
|
42
|
+
register,
|
|
43
|
+
unregister,
|
|
44
|
+
};
|
package/dist/env/.env.default
CHANGED
package/dist/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@
|
|
1
|
+
{"name":"@dataramen/local-server","version":"0.0.30","license":"MIT","main":"code/proxy.js","dependencies":{"@fastify/cors":"^11.0.1","dotenv":"^16.5.0","fast-glob":"^3.3.3","fastify":"^5.3.2","mysql2":"^3.14.1","pg":"^8.15.6","sqlite3":"^5.1.7","typeorm":"^0.3.23"},"devDependencies":{"yargs":"^18.0.0","fs-extra":"^11.3.0"}}
|