@dataramen/cli 0.0.19 → 0.0.21

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.
Binary file
@@ -0,0 +1,85 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ width="512"
6
+ height="512"
7
+ viewBox="0 0 512 512"
8
+ version="1.1"
9
+ id="svg1"
10
+ xml:space="preserve"
11
+ xmlns:xlink="http://www.w3.org/1999/xlink"
12
+ xmlns="http://www.w3.org/2000/svg"
13
+ xmlns:svg="http://www.w3.org/2000/svg"><defs
14
+ id="defs1" /><image
15
+ width="512"
16
+ height="512"
17
+ preserveAspectRatio="none"
18
+ xlink:href="data:image/png;base64,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&#10;"
19
+ id="image5"
20
+ x="0"
21
+ y="0"
22
+ style="display:none;opacity:0.246" /><g
23
+ id="layer1"><rect
24
+ style="fill:#f2b88f;fill-opacity:1;stroke:#000000;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
25
+ id="rect9"
26
+ width="496"
27
+ height="36.862289"
28
+ x="11.293897"
29
+ y="47.497002"
30
+ ry="16"
31
+ transform="rotate(2.6267544)" /><circle
32
+ style="fill:#ffd883;fill-opacity:1;stroke:#000000;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
33
+ id="path16"
34
+ cx="236.18539"
35
+ cy="327.10275"
36
+ r="160" /><circle
37
+ style="fill:#ffd883;fill-opacity:1;stroke:#000000;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
38
+ id="circle16"
39
+ cx="236.18539"
40
+ cy="327.10275"
41
+ r="120" /><path
42
+ style="fill:#ffd883;fill-opacity:1;stroke:#000000;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
43
+ d="m 83.889831,7.1027542 h 48.000009 c 0,0 8,21.0050518 8,31.9999998 0,10.994948 -8,32 -8,32 0,0 -8,21.005052 -8,31.999996 0,10.99495 8,32 8,32 0,0 8,21.00505 8,32 0,10.99495 -8,32 -8,32 0,0 -8,21.00505 -8,32 0,10.99495 8,32 8,32 0,0 8,21.00505 8,32 0,10.99495 -8,32 -8,32 H 83.889831 c 0,0 8,-21.00505 8,-32 0,-10.99495 -8,-32 -8,-32 0,0 -8,-21.00505 -8,-32 0,-10.99495 8,-32 8,-32 0,0 8,-21.00505 8,-32 0,-10.99495 -8,-32 -8,-32 0,0 -8,-21.00505 -8,-32 0,-10.994944 8,-31.999996 8,-31.999996 0,0 8,-21.005052 8,-32 0,-10.994948 -8,-31.9999998 -8,-31.9999998 z"
44
+ id="path9" /><path
45
+ style="fill:#ffd883;fill-opacity:1;stroke:#000000;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
46
+ d="m 133.38348,7.1027542 h 48 c 0,0 8,21.0050518 8,31.9999998 0,10.994948 -8,32 -8,32 0,0 -8,21.005052 -8,31.999996 0,10.99495 8,32 8,32 0,0 8,21.00505 8,32 0,10.99495 -8,32 -8,32 0,0 -8,21.00505 -8,32 0,10.99495 8,32 8,32 0,0 8,21.00505 8,32 0,10.99495 -8,32 -8,32 h -48 c 0,0 8,-21.00505 8,-32 0,-10.99495 -8,-32 -8,-32 0,0 -8,-21.00505 -8,-32 0,-10.99495 8,-32 8,-32 0,0 8,-21.00505 8,-32 0,-10.99495 -8,-32 -8,-32 0,0 -8,-21.00505 -8,-32 0,-10.994944 8,-31.999996 8,-31.999996 0,0 8,-21.005052 8,-32 0,-10.994948 -8,-31.9999998 -8,-31.9999998 z"
47
+ id="path11" /><path
48
+ style="fill:#ffd883;fill-opacity:1;stroke:#000000;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
49
+ d="m 180.18539,7.1027542 h 48 c 0,0 8,21.0050518 8,31.9999998 0,10.994948 -8,32 -8,32 0,0 -8,21.005052 -8,31.999996 0,10.99495 8,32 8,32 0,0 8,21.00505 8,32 0,10.99495 -8,32 -8,32 0,0 -8,21.00505 -8,32 0,10.99495 8,32 8,32 0,0 8,21.00505 8,32 0,10.99495 -8,32 -8,32 h -48 c 0,0 8,-21.00505 8,-32 0,-10.99495 -8,-32 -8,-32 0,0 -8,-21.00505 -8,-32 0,-10.99495 8,-32 8,-32 0,0 8,-21.00505 8,-32 0,-10.99495 -8,-32 -8,-32 0,0 -8,-21.00505 -8,-32 0,-10.994944 8,-31.999996 8,-31.999996 0,0 8,-21.005052 8,-32 0,-10.994948 -8,-31.9999998 -8,-31.9999998 z"
50
+ id="path12" /><rect
51
+ style="fill:#f2b88f;fill-opacity:1;stroke:#000000;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
52
+ id="rect8"
53
+ width="496"
54
+ height="36.862289"
55
+ x="8"
56
+ y="8"
57
+ ry="16" /></g><g
58
+ id="layer3"
59
+ transform="rotate(3.9375263,-844.78065,-3921.8229)"><ellipse
60
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
61
+ id="path14"
62
+ cx="680.76331"
63
+ cy="140.84758"
64
+ rx="79.306068"
65
+ ry="99.608429" /><ellipse
66
+ style="display:inline;fill:#ffa100;fill-opacity:1;stroke:none;stroke-width:18.1962;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:436.709, 436.709;stroke-dashoffset:0;stroke-opacity:1"
67
+ id="path15"
68
+ cx="683.64093"
69
+ cy="158.35594"
70
+ rx="46.178188"
71
+ ry="61.330406" /><path
72
+ id="ellipse16"
73
+ style="fill:#000000;fill-opacity:0.3;stroke:none;stroke-width:16.322;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
74
+ d="M 682.03125,41.251953 V 240.44336 a 82.529814,99.608429 0 0 0 81.2113,-99.5957 82.529814,99.608429 0 0 0 -81.2113,-99.595707 z" /></g><g
75
+ id="layer2"
76
+ style="display:inline"><path
77
+ id="path5"
78
+ style="fill:#ff9b87;fill-opacity:1;stroke:#000000;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
79
+ d="M 8.1289062,240.67161 C 10.937662,327.69773 58.339875,437.95276 127.97531,480 165.38832,502.59071 209.21915,504.00003 256,504 c 46.77056,3e-5 90.59239,-1.40358 128,-23.9851 69.64892,-42.04433 117.062,-152.30689 119.87109,-239.34329 z" /><path
80
+ id="path13"
81
+ style="fill:#ff6c52;fill-opacity:1;stroke:#000000;stroke-width:16;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
82
+ d="m 11.023438,272.8125 c 3.499357,24.23767 9.952488,49.33995 18.943359,73.5957 H 482.03125 c 8.99127,-24.25564 15.44584,-49.3578 18.94531,-73.5957 z" /><path
83
+ style="display:inline;fill:#000000;fill-opacity:0.301653;stroke:none;stroke-width:15.0442;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
84
+ d="m 260.75549,498.04372 c 17.17737,-8.91298 36.49094,-23.93077 53.89626,-41.9085 44.3552,-45.8139 73.50119,-133.15473 81.14702,-199.94817 0.77681,-6.78613 1.41237,-12.87571 1.41237,-13.53238 0,-0.94441 11.16006,-1.19396 53.39443,-1.19396 H 504 l -0.36305,3.56439 c -3.64843,35.81994 -10.95682,88.53657 -24.3212,119.03858 -9.18329,20.95936 -25.34142,47.33594 -39.6031,64.64821 -21.54611,26.15487 -49.61549,48.45367 -73.58787,58.4595 -24.42993,10.19679 -58.67966,15.23864 -102.85351,15.14087 l -10.69658,-0.0238 z"
85
+ id="path8" /></g></svg>
@@ -0,0 +1,17 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/dataramen.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>DataRamen | Lightweight GUI for MySQL & PostgreSQL</title>
8
+ <meta name="description" content="Designed for speed, DataRamen makes navigating MySQL and PostgreSQL data effortless with a clean, high-performance interface." />
9
+ <script defer data-domain="dataramen.xyz" src="https://plausible.io/js/script.hash.pageview-props.tagged-events.js"></script>
10
+ <script>window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }</script>
11
+ <script type="module" crossorigin src="/assets/index-CBAZG-NN.js"></script>
12
+ <link rel="stylesheet" crossorigin href="/assets/index-Dfbw9I3p.css">
13
+ </head>
14
+ <body>
15
+ <div id="root"></div>
16
+ </body>
17
+ </html>
@@ -1,9 +1,9 @@
1
- "use strict";var dt=Object.create;var ne=Object.defineProperty;var mt=Object.getOwnPropertyDescriptor;var pt=Object.getOwnPropertyNames;var ft=Object.getPrototypeOf,yt=Object.prototype.hasOwnProperty;var B=(a,e)=>()=>(e||a((e={exports:{}}).exports,e),e.exports);var ht=(a,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of pt(e))!yt.call(a,s)&&s!==t&&ne(a,s,{get:()=>e[s],enumerable:!(r=mt(e,s))||r.enumerable});return a};var P=(a,e,t)=>(t=a!=null?dt(ft(a)):{},ht(e||!a||!a.__esModule?ne(t,"default",{value:a,enumerable:!0}):t,a));var Me=B(qe=>{"use strict";Object.defineProperty(qe,"__esModule",{value:!0})});var xe=B(G=>{"use strict";Object.defineProperty(G,"__esModule",{value:!0});G.isString=void 0;var kt=a=>typeof a=="string";G.isString=kt});var Fe=B(L=>{"use strict";Object.defineProperty(L,"__esModule",{value:!0});L.SQLManipulator=L.SQLBuilder=L.SQLParser=void 0;var ve=xe(),K=class{constructor(e="mysql"){this.dialect=e}parse(e){let r=e.trim().replace(/;$/,"").replace(/\s+/g," "),s=r.toUpperCase(),o;if(s.startsWith("SELECT"))o=this.parseSelect(r);else if(s.startsWith("INSERT"))o=this.parseInsert(r);else if(s.startsWith("UPDATE"))o=this.parseUpdate(r);else if(s.startsWith("DELETE"))o=this.parseDelete(r);else throw new Error("Unsupported SQL statement type");return o.parameters=this.extractParameters(r),o}extractParameters(e){let t=/:(\w+)/g,r=[],s;for(;(s=t.exec(e))!==null;){let o=s[1];r.includes(o)||r.push(o)}return r}parseSelect(e){let t={type:"SELECT"},{cleanedSQL:r,subqueries:s}=this.extractSubqueries(e),o=r.match(/SELECT\s+(.*?)\s+FROM/i);if(o){let d=o[1].trim();t.columns=d==="*"?["*"]:this.parseColumns(d)}let n=r.match(/FROM\s+([^\s]+)(?:\s|$)/i);if(n&&(t.table=n[1]),!t.table){let d=r.match(/FROM\s+([^\s]+)(?:\s+(?:AS\s+)?([^\s]+))?(?:\s+(?:WHERE|JOIN|INNER|LEFT|RIGHT|FULL|GROUP|ORDER|LIMIT|OFFSET|HAVING)|$)/i);d&&(t.table=d[1])}t.joins=this.parseJoins(r);let u=r.match(/WHERE\s+(.*?)(?:\s+GROUP\s+BY|\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/i);u&&(t.where=this.restoreSubqueries(u[1].trim(),s));let i=r.match(/ORDER\s+BY\s+(.*?)(?:\s+LIMIT|\s+OFFSET|$)/i);i&&(t.orderBy=this.parseOrderBy(i[1]));let l=r.match(/GROUP\s+BY\s+(.*?)(?:\s+HAVING|\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/i);l&&(t.groupBy=this.parseColumns(l[1]));let m=r.match(/HAVING\s+(.*?)(?:\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/i);m&&(t.having=this.restoreSubqueries(m[1].trim(),s));let E=r.match(/LIMIT\s+(\d+)/i);E&&(t.limit=parseInt(E[1]));let p=r.match(/OFFSET\s+(\d+)/i);return p&&(t.offset=parseInt(p[1])),t}parseColumns(e){let t=[],r="",s=!1,o="",n=0;for(let u=0;u<e.length;u++){let i=e[u];!s&&(i==='"'||i==="'")?(s=!0,o=i,r+=i):s&&i===o?u+1<e.length&&e[u+1]===o?(r+=i+i,u++):(s=!1,o="",r+=i):!s&&i==="("?(n++,r+=i):!s&&i===")"?(n--,r+=i):!s&&i===","&&n===0?(t.push(r.trim()),r=""):r+=i}return r.trim()&&t.push(r.trim()),t}extractSubqueries(e){let t=new Map,r=e,s=0,o=/\(([^()]*(?:SELECT|INSERT|UPDATE|DELETE)[^()]*(?:\([^()]*\)[^()]*)*)\)/gi,n=!0;for(;n;)n=!1,r=r.replace(o,(u,i)=>{if(/\b(SELECT|INSERT|UPDATE|DELETE)\b/i.test(i)){let l=`__SUBQUERY_${s}__`;return t.set(l,u),s++,n=!0,l}return u});return{cleanedSQL:r,subqueries:t}}restoreSubqueries(e,t){let r=e;return t.forEach((s,o)=>{r=r.replace(new RegExp(o,"g"),s)}),r}parseJoins(e){let t=[],r=/((?:INNER|LEFT|RIGHT|FULL)?\s*JOIN)\s+(\w+(?:\s+\w+)?)\s+ON\s+(.*?)(?=\s+(?:INNER|LEFT|RIGHT|FULL)?\s*JOIN|\s+WHERE|\s+GROUP\s+BY|\s+ORDER\s+BY|\s+LIMIT|\s+OFFSET|$)/gi,s;for(;(s=r.exec(e))!==null;){let o=s[1].trim().toUpperCase(),n=s[2].trim(),u=s[3].trim(),i=n.split(/\s+/),l=i[0],m=i.length>1?i[1]:void 0,E;o.includes("LEFT")?E="LEFT":o.includes("RIGHT")?E="RIGHT":o.includes("FULL")?E="FULL":E="INNER",t.push({type:E,table:l,alias:m,on:u})}return t.length>0?t:[]}parseInsert(e){let t={type:"INSERT"},r=e.match(/INSERT\s+INTO\s+(\w+)\s*\(([^)]+(?:\([^)]*\)[^)]*)*)\)\s*VALUES\s*\((.+)\)\s*;?$/i);return r&&(t.table=r[1],t.columns=this.parseColumns(r[2]),t.values=this.parseColumns(r[3])),t}parseUpdate(e){let t={type:"UPDATE"},r=e.match(/UPDATE\s+(\w+)\s+SET\s+(.*?)(?:\s+WHERE|$)/i);r&&(t.table=r[1],t.set=this.parseSetClause(r[2]));let s=e.match(/WHERE\s+(.*?)$/i);return s&&(t.where=s[1].trim()),t}parseDelete(e){let t={type:"DELETE"},r=e.match(/DELETE\s+FROM\s+(\w+)(?:\s+WHERE\s+(.*?))?$/i);return r&&(t.table=r[1],r[2]&&(t.where=r[2].trim())),t}parseOrderBy(e){return e.split(",").map(r=>{let s=r.trim().split(" "),o=s.pop();return o==="DESC"||o==="desc"?{column:s.join(" "),direction:"DESC"}:o==="ASC"||o==="asc"?{column:s.join(" "),direction:"ASC"}:{column:s.join(" ")+" "+o,direction:"ASC"}})}parseSetClause(e){let t={};return this.parseColumns(e).forEach(s=>{let o=s.indexOf("=");if(o>0){let n=s.substring(0,o).trim(),u=s.substring(o+1).trim();t[n]=u}}),t}};L.SQLParser=K;var $=class{constructor(e,t="mysql"){this.parsed={...e},this.dialect=t}build(){switch(this.parsed.type){case"SELECT":return this.buildSelect();case"INSERT":return this.buildInsert();case"UPDATE":return this.buildUpdate();case"DELETE":return this.buildDelete();default:throw new Error("Unsupported SQL type")}}buildSelect(){let e="SELECT ";if(this.parsed.columns&&this.parsed.columns.length>0?e+=this.parsed.columns.join(", "):e+="*",this.parsed.table&&(e+=` FROM ${this.parsed.table}`),this.parsed.joins&&this.parsed.joins.length>0&&this.parsed.joins.forEach(t=>{e+=` ${t.type} JOIN ${t.table} ON ${t.on}`}),this.parsed.where&&(e+=` WHERE ${this.parsed.where}`),this.parsed.groupBy&&this.parsed.groupBy.length>0&&(e+=` GROUP BY ${this.parsed.groupBy.join(", ")}`),this.parsed.having&&(e+=` HAVING ${this.parsed.having}`),this.parsed.orderBy&&this.parsed.orderBy.length>0){let t=this.parsed.orderBy.reduce((s,o)=>(s[o.column]=o.direction,s),{}),r=Object.entries(t).map(([s,o])=>`${s} ${o}`);e+=` ORDER BY ${r.join(", ")}`}return this.parsed.limit!==void 0&&(e+=` LIMIT ${this.parsed.limit}`),this.parsed.offset!==void 0&&(this.dialect==="mysql"?e+=` OFFSET ${this.parsed.offset}`:e+=` OFFSET ${this.parsed.offset}`),e}buildInsert(){if(!this.parsed.table||!this.parsed.columns||!this.parsed.values)throw new Error("Invalid INSERT statement data");let e=this.parsed.columns.join(", "),t=this.parsed.values.join(", ");return`INSERT INTO ${this.parsed.table} (${e}) VALUES (${t})`}buildUpdate(){if(!this.parsed.table||!this.parsed.set)throw new Error("Invalid UPDATE statement data");let e=Object.entries(this.parsed.set).map(([r,s])=>`${r} = ${s}`),t=`UPDATE ${this.parsed.table} SET ${e.join(", ")}`;return this.parsed.where&&(t+=` WHERE ${this.parsed.where}`),t}buildDelete(){if(!this.parsed.table)throw new Error("Invalid DELETE statement data");let e=`DELETE FROM ${this.parsed.table}`;return this.parsed.where&&(e+=` WHERE ${this.parsed.where}`),e}};L.SQLBuilder=$;var oe=class{constructor(e="mysql",t){this.dialect=e,this.parser=new K(e),this.parsed=t==="SELECT"?{type:"SELECT"}:this.parser.parse(t),this.parameters={}}setParameter(e,t){return this.parameters[e]=t,this}setParameters(e){return this.parameters={...this.parameters,...e},this}getParameter(e){return this.parameters[e]}getParameters(){return{...this.parameters}}clearParameters(){return this.parameters={},this}getRequiredParameters(){return this.parsed.parameters||[]}getMissingParameters(){let e=this.getRequiredParameters(),t=Object.keys(this.parameters);return e.filter(r=>!t.includes(r))}addWhereWithParam(e,t,r,s="AND"){let o=this.buildWhereConditionWithParam(e,t,r);return this.parsed.where?this.parsed.where+=` ${s} ${o}`:this.parsed.where=o,this.parsed.parameters||(this.parsed.parameters=[]),this.parsed.parameters.includes(r)||this.parsed.parameters.push(r),this}addWhere(e){let t=this.buildWhereCondition(e);if(this.parsed.where){let r=e.connector||"AND";this.parsed.where+=` ${r} ${t}`}else this.parsed.where=t;return this}addWhereRaw(e,t="AND"){return this.parsed.where?this.parsed.where+=` ${t} ${e}`:this.parsed.where=e,this}clearWhere(){return this.parsed.where=void 0,this}addOrderBy(...e){return this.parsed.orderBy||(this.parsed.orderBy=[]),this.parsed.orderBy.push(...e),this}clearOrderBy(){return this.parsed.orderBy=void 0,this}setLimit(e){return this.parsed.limit=e,this}setOffset(e){return this.parsed.offset=e,this}addGroupBy(e){this.parsed.groupBy||(this.parsed.groupBy=[]);let t=this.parsed.groupBy.findIndex(r=>r===e);return t>-1?this.parsed.groupBy[t]=e:this.parsed.groupBy.push(e),this}setHaving(e){return this.parsed.having=e,this}setTable(e){return this.parsed.table=e,this}addJoin(...e){if(this.parsed.type!=="SELECT")throw new Error("JOIN operations are only supported for SELECT queries");return this.parsed.joins||(this.parsed.joins=[]),this.parsed.joins.push(...e),this}selectColumns(e){if(this.parsed.type!=="SELECT")throw new Error("Column selection is only supported for SELECT queries");return this.parsed.columns=e,this}toSQL(e=!1,t=!1){let s=new $(this.parsed,this.dialect).build();return e&&(s=this.substituteParameters(s)),t&&(s+=";"),s}toParameterizedSQL(e=!1){let r=new $(this.parsed,this.dialect).build();return e?r+";":r}toExecutableSQL(e=!1){return this.toSQL(!0,e)}substituteParameters(e){let t=e;return Object.entries(this.parameters).forEach(([r,s])=>{let o=new RegExp(`:${r}\\b`,"g"),n=this.formatParameterValue(s);t=t.replace(o,n)}),t}formatParameterValue(e){return e==null?"NULL":typeof e=="string"?e:typeof e=="boolean"?this.dialect==="postgres"?e?"TRUE":"FALSE":e?"1":"0":Array.isArray(e)?`(${e.map(r=>this.formatParameterValue(r)).join(", ")})`:e instanceof Date?`'${e.toISOString().slice(0,19).replace("T"," ")}'`:String(e)}buildWhereConditionWithParam(e,t,r){switch(t){case"IS NULL":case"IS NOT NULL":return`${e} ${t}`;case"IN":case"NOT IN":return`${e} ${t} :${r}`;default:return`${e} ${t} :${r}`}}getParsed(){return{...this.parsed}}buildWhereCondition(e){let{column:t,operator:r,value:s}=e;switch(r){case"IS NULL":case"IS NOT NULL":return`${t} ${r}`;case"IN":case"NOT IN":let o=s?.map(i=>(0,ve.isString)(i.value)?`'${i.value}'`:i.value).join(", ");return`${t} ${r} (${o})`;default:let n=s?.[0],u;return(0,ve.isString)(n?.value)&&n?.isColumn!==!0?u=`'${n?.value}'`:u=n?.value,`${t} ${r} ${u}`}}};L.SQLManipulator=oe});var $e=B(k=>{"use strict";var Ut=k&&k.__createBinding||(Object.create?function(a,e,t,r){r===void 0&&(r=t);var s=Object.getOwnPropertyDescriptor(e,t);(!s||("get"in s?!e.__esModule:s.writable||s.configurable))&&(s={enumerable:!0,get:function(){return e[t]}}),Object.defineProperty(a,r,s)}:function(a,e,t,r){r===void 0&&(r=t),a[r]=e[t]}),Qe=k&&k.__exportStar||function(a,e){for(var t in a)t!=="default"&&!Object.prototype.hasOwnProperty.call(e,t)&&Ut(e,a,t)};Object.defineProperty(k,"__esModule",{value:!0});Qe(Me(),k);Qe(Fe(),k)});var H=require("dotenv"),j=require("node:path"),ie=require("node:fs"),gt=(()=>{try{let a=(0,ie.readFileSync)((0,j.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(a)}catch{return{version:"0.0.0"}}})();(0,H.config)({path:[(0,j.join)(__dirname,"..","env",".env"),(0,j.join)(__dirname,"..","env",".env.default")]});(0,H.populate)(process.env,{SERVER_VERSION:gt.version});var it=P(require("fastify")),ut=P(require("@fastify/cors"));var c=class extends Error{constructor(t,r){super(r);this.status=t;this.message=r}};var ye=require("typeorm");var ue=require("typeorm"),V=new ue.EntitySchema({name:"DatabaseInspection",tableName:"db_inspection",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},tableName:{nullable:!0,type:String},columns:{type:"json",nullable:!0},createdAt:{type:"datetime",default:"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:"CURRENT_TIMESTAMP"}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var ce=require("typeorm"),z=new ce.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"}},relations:{users:{type:"many-to-many",target:()=>"User",inverseSide:"teams"},workbooks:{type:"one-to-many",target:()=>"Workbook",inverseSide:"team"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"team"},datasources:{type:"one-to-many",target:()=>"DataSource",inverseSide:"team"}}});var le=require("typeorm"),J=new le.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:"datetime",default:"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:"CURRENT_TIMESTAMP"}},relations:{teams:{type:"many-to-many",target:()=>"Team",inverseSide:"users",joinTable:!0},settings:{type:"one-to-one",target:()=>"UserSettings",inverseSide:"user",joinColumn:!0},currentTeam:{type:"many-to-one",target:()=>"Team",joinColumn:!0}}});var de=require("typeorm"),Z=new de.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},openAiToken:{type:String,nullable:!0},model:{type:String,default:"gpt-3.5-turbo"},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var me=require("typeorm"),X=new me.EntitySchema({name:"Workbook",tableName:"workbooks",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},path:{type:"uuid",generated:"uuid"},isTrash:{type:"boolean",default:!1},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"workbooks",joinColumn:!0}}});var pe=require("typeorm"),ee=new pe.EntitySchema({name:"DataSource",tableName:"data_sources",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},dbUrl:{type:String},dbPort:{type:Number,nullable:!0},dbUser:{type:String},dbPassword:{type:String,nullable:!0},dbType:{type:String},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},name:{type:String},description:{type:String,nullable:!0},dbDatabase:{type:String},dbSchema:{type:String,nullable:!0},lastInspected:{type:"datetime",nullable:!0,default:()=>null},status:{type:String,nullable:!0}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"datasources",joinColumn:!0},inspections:{type:"one-to-many",target:()=>"DatabaseInspection",inverseSide:"datasource"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"dataSource"},owner:{type:"many-to-one",target:()=>"User",joinColumn:!0}}});var he=P(require("os"));var fe=require("typeorm"),te=new fe.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",default:"{}"},isTrash:{type:Boolean,default:!1,nullable:!0},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"workbooks",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",inverseSide:"queries",joinColumn:!0}}});function Tt(){let a=process.env.TYPEORM_DATABASE;if(!a)throw new Error("Bad value for TYPEORM_DATABASE. Please check your config!");return a.startsWith("<home>")&&(a=a.replace("<home>",he.default.homedir())),a}var S=new ye.DataSource({type:process.env.TYPEORM_CONNECTION,database:Tt(),synchronize:process.env.TYPEORM_SYNCHRONIZE==="true",host:process.env.TYPEORM_HOST,username:process.env.TYPEORM_USERNAME,password:process.env.TYPEORM_PASSWORD,port:process.env.TYPEORM_PORT?parseInt(process.env.TYPEORM_PORT):void 0,logging:process.env.TYPEORM_LOGGING==="true",entities:[V,ee,z,J,Z,X,te]}),ge=async()=>{if(!S.isInitialized)return S.initialize();throw new Error("Already initialized")},N=S.getRepository(V),g=S.getRepository(ee),q=S.getRepository(z),I=S.getRepository(J),C=S.getRepository(Z),b=S.getRepository(X),R=S.getRepository(te);var Q=P(require("node:fs/promises")),re=require("node:path"),Te=P(require("node:os")),Et=Te.default.homedir(),ae=(0,re.join)(Et,".dataramen",".runtime","files"),Ee=a=>(0,re.join)(ae,a),Se=async a=>Q.default.readFile(Ee(a),{encoding:"utf8"}),we=async(a,e)=>Q.default.writeFile(Ee(a),e,{encoding:"utf8"});var be=async()=>{await St()||await Q.default.mkdir(ae,{recursive:!0})};async function St(){try{return(await Q.default.lstat(ae)).isDirectory()}catch{return!1}}var f=a=>(e,t,r)=>{a(e),r()};var Re=f(a=>{a.post("/workbook",async e=>({data:""}))});var y=(a,e)=>{let t=a.body;return e&&e(t),t},_=(a,e)=>{let t=a.query;return e&&e(t),t},h=(a,e)=>{let t=a.params;return e&&e(t),t};var D=a=>a.headers["phoenix-user-id"];var Ie=a=>{if(!a.dbUrl)throw new c(400,"url is required");if(!a.dbUser)throw new c(400,"user is required");if(!a.dbType)throw new c(400,"type is required");if(!a.name)throw new c(400,"name is required");if(!a.dbDatabase)throw new c(400,"database is required")};var Oe=P(require("mysql2/promise"));var bt=({dbDatabase:a,dbPassword:e,dbUser:t,dbUrl:r})=>Oe.default.createConnection({host:r,user:t,database:a,password:e}),Rt=async a=>{let e=`
1
+ "use strict";var tt=Object.create;var re=Object.defineProperty;var rt=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var ot=Object.getPrototypeOf,nt=Object.prototype.hasOwnProperty;var q=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var st=(t,e,r,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of at(e))!nt.call(t,o)&&o!==r&&re(t,o,{get:()=>e[o],enumerable:!(a=rt(e,o))||a.enumerable});return t};var _=(t,e,r)=>(r=t!=null?tt(ot(t)):{},st(e||!t||!t.__esModule?re(r,"default",{value:t,enumerable:!0}):r,t));var Ue=q(Pe=>{"use strict";Object.defineProperty(Pe,"__esModule",{value:!0})});var Z=q(R=>{"use strict";Object.defineProperty(R,"__esModule",{value:!0});R.buildWhereCondition=R.buildSelect=R.isString=void 0;var bt=t=>typeof t=="string";R.isString=bt;var It=t=>{let e="SELECT ";if(t.columns&&t.columns.length>0?e+=t.columns.join(", "):e+="*",t.table&&(e+=` FROM ${t.table}`),t.joins&&t.joins.length>0&&t.joins.forEach(r=>{e+=` ${r.type} JOIN ${r.table} ON ${r.on}`}),t.where&&(e+=` WHERE ${t.where}`),t.groupBy&&t.groupBy.length>0&&(e+=` GROUP BY ${t.groupBy.join(", ")}`),t.having&&(e+=` HAVING ${t.having}`),t.orderBy&&t.orderBy.length>0){let r=t.orderBy.reduce((o,n)=>(o[n.column]=n.direction,o),{}),a=Object.entries(r).map(([o,n])=>`${o} ${n}`);e+=` ORDER BY ${a.join(", ")}`}return t.limit!==void 0&&(e+=` LIMIT ${t.limit}`),t.offset!==void 0&&(e+=` OFFSET ${t.offset}`),e};R.buildSelect=It;var Rt=t=>{let{column:e,operator:r,value:a}=t;switch(r){case"IS NULL":case"IS NOT NULL":return`${e} ${r}`;case"IN":case"NOT IN":let o=a?.map(i=>(0,R.isString)(i.value)?`'${i.value}'`:i.value).join(", ");return`${e} ${r} (${o})`;default:let n=a?.[0],s;return(0,R.isString)(n?.value)&&n?.isColumn!==!0?s=`'${n?.value}'`:s=n?.value,`${e} ${r} ${s}`}};R.buildWhereCondition=Rt});var Le=q(B=>{"use strict";Object.defineProperty(B,"__esModule",{value:!0});B.SelectQueryBuilder=void 0;var Me=Z(),X=class{constructor(e="mysql"){this.dialect=e,this.skeleton={type:"SELECT"}}addWhere(e){let r=(0,Me.buildWhereCondition)(e);if(this.skeleton.where){let a=e.connector||"AND";this.skeleton.where+=` ${a} ${r}`}else this.skeleton.where=r;return this}addWhereRaw(e,r="AND"){return this.skeleton.where?this.skeleton.where+=` ${r} ${e}`:this.skeleton.where=e,this}clearWhere(){return this.skeleton.where=void 0,this}addOrderBy(...e){return this.skeleton.orderBy||(this.skeleton.orderBy=[]),this.skeleton.orderBy.push(...e),this}clearOrderBy(){return this.skeleton.orderBy=void 0,this}setLimit(e){return this.skeleton.limit=e,this}setOffset(e){return this.skeleton.offset=e,this}addGroupBy(e){this.skeleton.groupBy||(this.skeleton.groupBy=[]);let r=this.skeleton.groupBy.findIndex(a=>a===e);return r>-1?this.skeleton.groupBy[r]=e:this.skeleton.groupBy.push(e),this}setHaving(e){return this.skeleton.having=e,this}setTable(e){return this.skeleton.table=e,this}addJoin(...e){return this.skeleton.joins||(this.skeleton.joins=[]),this.skeleton.joins.push(...e),this}selectColumns(e){if(this.skeleton.type!=="SELECT")throw new Error("Column selection is only supported for SELECT queries");return this.skeleton.columns=e,this}toSQL(){return(0,Me.buildSelect)(this.skeleton)}};B.SelectQueryBuilder=X});var xe=q(C=>{"use strict";var Nt=C&&C.__createBinding||(Object.create?function(t,e,r,a){a===void 0&&(a=r);var o=Object.getOwnPropertyDescriptor(e,r);(!o||("get"in o?!e.__esModule:o.writable||o.configurable))&&(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,a,o)}:function(t,e,r,a){a===void 0&&(a=r),t[a]=e[r]}),ee=C&&C.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&Nt(e,t,r)};Object.defineProperty(C,"__esModule",{value:!0});ee(Ue(),C);ee(Le(),C);ee(Z(),C)});var $=require("dotenv"),Q=require("node:path"),ae=require("node:fs"),it=(()=>{try{let t=(0,ae.readFileSync)((0,Q.join)(__dirname,"..","package.json"),"utf8");return JSON.parse(t)}catch{return{version:"0.0.0"}}})();(0,$.config)({path:[(0,Q.join)(__dirname,"..","env",".env"),(0,Q.join)(__dirname,"..","env",".env.default")]});(0,$.populate)(process.env,{SERVER_VERSION:it.version});var Ke=_(require("fastify")),ze=_(require("@fastify/cors")),Ve=_(require("@fastify/static"));var u=class extends Error{constructor(r,a){super(a);this.status=r;this.message=a}};var le=require("typeorm");var oe=require("typeorm"),W=new oe.EntitySchema({name:"DatabaseInspection",tableName:"db_inspection",columns:{id:{type:String,unique:!0,primary:!0,generated:"uuid"},tableName:{nullable:!0,type:String},columns:{type:"json",nullable:!0},createdAt:{type:"datetime",default:"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:"CURRENT_TIMESTAMP"}},relations:{datasource:{target:()=>"DataSource",type:"many-to-one",joinTable:!1,cascade:!0}}});var ne=require("typeorm"),j=new ne.EntitySchema({name:"Team",tableName:"teams",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"}},relations:{users:{type:"many-to-many",target:()=>"User",inverseSide:"teams"},workbooks:{type:"one-to-many",target:()=>"Workbook",inverseSide:"team"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"team"},datasources:{type:"one-to-many",target:()=>"DataSource",inverseSide:"team"}}});var se=require("typeorm"),Y=new se.EntitySchema({name:"User",tableName:"users",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},createdAt:{type:"datetime",default:"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:"CURRENT_TIMESTAMP"}},relations:{teams:{type:"many-to-many",target:()=>"Team",inverseSide:"users",joinTable:!0},settings:{type:"one-to-one",target:()=>"UserSettings",inverseSide:"user",joinColumn:!0},currentTeam:{type:"many-to-one",target:()=>"Team",joinColumn:!0}}});var ie=require("typeorm"),H=new ie.EntitySchema({name:"UserSettings",tableName:"user_settings",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},openAiToken:{type:String,nullable:!0},model:{type:String,default:"gpt-3.5-turbo"},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"}},relations:{user:{type:"one-to-one",target:()=>"User",inverseSide:"settings",joinColumn:!0}}});var ue=require("typeorm"),G=new ue.EntitySchema({name:"Workbook",tableName:"workbooks",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},path:{type:"uuid",generated:"uuid"},isTrash:{type:"boolean",default:!1},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"workbooks",joinColumn:!0}}});var ce=require("typeorm"),K=new ce.EntitySchema({name:"DataSource",tableName:"data_sources",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},dbUrl:{type:String},dbPort:{type:Number,nullable:!0},dbUser:{type:String},dbPassword:{type:String,nullable:!0},dbType:{type:String},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},name:{type:String},description:{type:String,nullable:!0},dbDatabase:{type:String},dbSchema:{type:String,nullable:!0},lastInspected:{type:"datetime",nullable:!0,default:()=>null},status:{type:String,nullable:!0}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"datasources",joinColumn:!0},inspections:{type:"one-to-many",target:()=>"DatabaseInspection",inverseSide:"datasource"},queries:{type:"one-to-many",target:()=>"Query",inverseSide:"dataSource"},owner:{type:"many-to-one",target:()=>"User",joinColumn:!0}}});var de=_(require("os"));var me=require("typeorm"),z=new me.EntitySchema({name:"Query",tableName:"query",columns:{id:{type:"uuid",primary:!0,generated:"uuid"},name:{type:String},opts:{type:"json",default:"{}"},isTrash:{type:Boolean,default:!1,nullable:!0},createdAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP"},updatedAt:{type:"datetime",default:()=>"CURRENT_TIMESTAMP",onUpdate:"CURRENT_TIMESTAMP"}},relations:{team:{type:"many-to-one",target:()=>"Team",inverseSide:"workbooks",joinColumn:!0},dataSource:{type:"many-to-one",target:()=>"DataSource",inverseSide:"queries",joinColumn:!0}}});function ut(){let t=process.env.TYPEORM_DATABASE;if(!t)throw new Error("Bad value for TYPEORM_DATABASE. Please check your config!");return t.startsWith("<home>")&&(t=t.replace("<home>",de.default.homedir())),t}var T=new le.DataSource({type:process.env.TYPEORM_CONNECTION,database:ut(),synchronize:process.env.TYPEORM_SYNCHRONIZE==="true",host:process.env.TYPEORM_HOST,username:process.env.TYPEORM_USERNAME,password:process.env.TYPEORM_PASSWORD,port:process.env.TYPEORM_PORT?parseInt(process.env.TYPEORM_PORT):void 0,logging:process.env.TYPEORM_LOGGING==="true",entities:[W,K,j,Y,H,G,z]}),pe=async()=>{if(!T.isInitialized)return T.initialize();throw new Error("Already initialized")},I=T.getRepository(W),l=T.getRepository(K),U=T.getRepository(j),b=T.getRepository(Y),M=T.getRepository(H),ye=T.getRepository(G),E=T.getRepository(z);var V=_(require("node:fs/promises")),fe=require("node:path"),Te=_(require("node:os")),ct=Te.default.homedir(),ge=(0,fe.join)(ct,".dataramen",".runtime","files"),Se=async()=>{await mt()||await V.default.mkdir(ge,{recursive:!0})};async function mt(){try{return(await V.default.lstat(ge)).isDirectory()}catch{return!1}}var g=t=>(e,r,a)=>{t(e),a()};var f=(t,e)=>{let r=t.body;return e&&e(r),r},x=(t,e)=>{let r=t.query;return e&&e(r),r},S=(t,e)=>{let r=t.params;return e&&e(r),r},A=t=>t.headers["phoenix-user-id"];var he=t=>{if(!t.dbUrl)throw new u(400,"url is required");if(!t.dbUser)throw new u(400,"user is required");if(!t.dbType)throw new u(400,"type is required");if(!t.name)throw new u(400,"name is required");if(!t.dbDatabase)throw new u(400,"database is required")};var we=_(require("mysql2/promise"));var lt=({dbDatabase:t,dbPassword:e,dbUser:r,dbUrl:a})=>we.default.createConnection({host:a,user:r,database:t,password:e}),dt=async t=>{let e=`
2
2
  SELECT TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION
3
3
  FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
4
4
  WHERE CONSTRAINT_NAME = 'PRIMARY'
5
5
  ORDER BY TABLE_NAME, ORDINAL_POSITION;
6
- `,[t]=await a.execute(e),r={};return t.forEach(s=>{let o=s.TABLE_NAME,n=s.COLUMN_NAME;r[o]||(r[o]=[]),r[o].push(n)}),r},It=async a=>{let e=`
6
+ `,[r]=await t.execute(e),a={};return r.forEach(o=>{let n=o.TABLE_NAME,s=o.COLUMN_NAME;a[n]||(a[n]=[]),a[n].push(s)}),a},pt=async t=>{let e=`
7
7
  SELECT
8
8
  TABLE_NAME AS table_name,
9
9
  COLUMN_NAME AS field,
@@ -14,7 +14,7 @@
14
14
  WHERE
15
15
  REFERENCED_TABLE_NAME IS NOT NULL
16
16
  AND CONSTRAINT_SCHEMA = DATABASE();
17
- `,[t]=await a.execute(e),r={};return Array.isArray(t)&&t.forEach(s=>{r[s.table_name]||(r[s.table_name]={}),r[s.table_name][s.field]={refTable:s.referenced_table,refField:s.referenced_field}}),r},Nt=async(a,e)=>{let r=(await e.query("SHOW TABLES"))[0],s=await It(e),o=await Rt(e),n=r.map(async u=>{let i=Object.values(u)[0],l=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${a.dbDatabase}' and table_name = '${i}'`,[m]=await e.query(l),E=s[i];return{columns:m.map(p=>({name:p.COLUMN_NAME,type:p.DATA_TYPE,isPrimary:o[i]?.includes(p.COLUMN_NAME),ref:E?.[p.COLUMN_NAME]?{table:E[p.COLUMN_NAME].refTable,field:E[p.COLUMN_NAME].refField}:void 0})).sort((p,d)=>p.isPrimary&&d.isPrimary?p.name.localeCompare(d.name):p.isPrimary?-1:1),createdAt:new Date,tableName:i,updatedAt:new Date}});return Promise.all(n)},Ne=async(a,e,t)=>{try{console.log(`[MYSQL CONN] Query: ${a}`);let[r,s]=await e.query({sql:a,rowsAsArray:!0}),o=r?.constructor?.name;if(o==="ResultSetHeader"){let n=r;if(n.affectedRows>3&&t.allowBulkUpdate!==!0)throw new Error("[MYSQL CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[n.affectedRows]],query:a}}else if(o==="Array"){let n=r;return{columns:s?.map(u=>({column:u.orgName||u.name,table:u.orgTable,alias:u.name,full:u.orgTable?u.orgTable+"."+u.orgName:u.name}))||[],rows:n,query:a}}throw new Error(`[MYSQL CONN] Unknown result type: ${o}`)}catch(r){throw console.error(r),r instanceof c?r:new c(400,r.message)}},Ot=async(a,e)=>{await a.beginTransaction();try{let t=await e();return await a.commit(),console.log("[MYSQL CONN] Commit"),t}catch(t){throw await a.rollback(),console.warn(t.message),console.log("[MYSQL CONN] Rollback"),t}},Ce=async a=>{let e=await bt(a),t=!1;return{dbType:"mysql",dataSource:a,inspectSchema:()=>Nt(a,e),executeQuery:(r,s)=>s.type==="SELECT"?Ne(r,e,s):Ot(e,()=>Ne(r,e,s)),checkConnection:async()=>e.ping(),isClosed:()=>t,close:async()=>{if(!t)return t=!0,e.destroy()}}};var Pe=P(require("pg"));var Ct=async({dbDatabase:a,dbPassword:e,dbUser:t,dbUrl:r,dbPort:s})=>{let o=new Pe.default.Client({host:r,user:t,database:a,password:e,port:s,query_timeout:1e4});return await o.connect(),o},At=async a=>{let t=await a.query(`
17
+ `,[r]=await t.execute(e),a={};return Array.isArray(r)&&r.forEach(o=>{a[o.table_name]||(a[o.table_name]={}),a[o.table_name][o.field]={refTable:o.referenced_table,refField:o.referenced_field}}),a},yt=async(t,e)=>{let a=(await e.query("SHOW TABLES"))[0],o=await pt(e),n=await dt(e),s=a.map(async i=>{let m=Object.values(i)[0],c=`select COLUMN_NAME, DATA_TYPE from information_schema.columns where table_schema = '${t.dbDatabase}' and table_name = '${m}'`,[w]=await e.query(c),N=o[m];return{columns:w.map(d=>({name:d.COLUMN_NAME,type:d.DATA_TYPE,isPrimary:n[m]?.includes(d.COLUMN_NAME),ref:N?.[d.COLUMN_NAME]?{table:N[d.COLUMN_NAME].refTable,field:N[d.COLUMN_NAME].refField}:void 0})).sort((d,p)=>d.isPrimary&&p.isPrimary?d.name.localeCompare(p.name):d.isPrimary?-1:1),createdAt:new Date,tableName:m,updatedAt:new Date}});return Promise.all(s)},Ee=async(t,e,r)=>{try{console.log(`[MYSQL CONN] Query: ${t}`);let[a,o]=await e.query({sql:t,rowsAsArray:!0}),n=a?.constructor?.name;if(n==="ResultSetHeader"){let s=a;if(s.affectedRows>3&&r.allowBulkUpdate!==!0)throw new Error("[MYSQL CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[s.affectedRows]],query:t}}else if(n==="Array"){let s=a;return{columns:o?.map(i=>({column:i.orgName||i.name,table:i.orgTable,alias:i.name,full:i.orgTable?i.orgTable+"."+i.orgName:i.name}))||[],rows:s,query:t}}throw new Error(`[MYSQL CONN] Unknown result type: ${n}`)}catch(a){throw console.error(a),a instanceof u?a:new u(400,a.message)}},ft=async(t,e)=>{await t.beginTransaction();try{let r=await e();return await t.commit(),console.log("[MYSQL CONN] Commit"),r}catch(r){throw await t.rollback(),console.warn(r.message),console.log("[MYSQL CONN] Rollback"),r}},be=async t=>{let e=await lt(t),r=!1;return{dbType:"mysql",dataSource:t,inspectSchema:()=>yt(t,e),executeQuery:(a,o)=>o.type==="SELECT"?Ee(a,e,o):ft(e,()=>Ee(a,e,o)),checkConnection:async()=>e.ping(),isClosed:()=>r,close:async()=>{if(!r)return r=!0,e.destroy()}}};var Re=_(require("pg"));var Tt=async({dbDatabase:t,dbPassword:e,dbUser:r,dbUrl:a,dbPort:o})=>{let n=new Re.default.Client({host:a,user:r,database:t,password:e,port:o,query_timeout:1e4});return await n.connect(),n},gt=async t=>{let r=await t.query(`
18
18
  SELECT
19
19
  kcu.table_name,
20
20
  kcu.column_name,
@@ -28,7 +28,7 @@
28
28
  tc.constraint_type = 'PRIMARY KEY'
29
29
  ORDER BY
30
30
  kcu.table_name, kcu.ordinal_position;
31
- `),r={};return t.rows.forEach(s=>{let o=s.table_name,n=s.column_name;r[o]||(r[o]=[]),r[o].push(n)}),r},Pt=async a=>{let t=await a.query(`
31
+ `),a={};return r.rows.forEach(o=>{let n=o.table_name,s=o.column_name;a[n]||(a[n]=[]),a[n].push(s)}),a},St=async t=>{let r=await t.query(`
32
32
  SELECT
33
33
  tc.table_name AS table_name,
34
34
  kcu.column_name AS field,
@@ -43,21 +43,21 @@
43
43
  ON ccu.constraint_name = tc.constraint_name
44
44
  AND ccu.table_schema = tc.table_schema
45
45
  WHERE tc.constraint_type = 'FOREIGN KEY';
46
- `),r={};return t.rows.forEach(s=>{r[s.table_name]||(r[s.table_name]={}),r[s.table_name][s.field]={refTable:s.referenced_table,refField:s.referenced_field}}),r},_t=async(a,e)=>{let t=`SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = '${a.dbSchema}'`,s=(await e.query(t)).rows,o=await Pt(e),n=await At(e),u=s.map(async i=>{let l=Object.values(i)[0],m=`
46
+ `),a={};return r.rows.forEach(o=>{a[o.table_name]||(a[o.table_name]={}),a[o.table_name][o.field]={refTable:o.referenced_table,refField:o.referenced_field}}),a},ht=async(t,e)=>{let r=`SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = '${t.dbSchema}'`,o=(await e.query(r)).rows,n=await St(e),s=await gt(e),i=o.map(async m=>{let c=Object.values(m)[0],w=`
47
47
  SELECT column_name, data_type
48
48
  FROM information_schema.columns
49
49
  WHERE
50
- table_name = '${l}' and
51
- table_schema = '${a.dbSchema}'
52
- `,{rows:E}=await e.query(m),p=o[l];return{columns:E.map(d=>({name:d.column_name,type:d.data_type,isPrimary:n[l]?.includes(d.column_name),ref:p?.[d.column_name]?{table:p[d.column_name].refTable,field:p[d.column_name].refField}:void 0})).sort((d,U)=>d.isPrimary&&U.isPrimary?d.name.localeCompare(U.name):d.isPrimary?-1:1),createdAt:new Date,tableName:l,updatedAt:new Date}});return Promise.all(u)},Dt=async(a,e)=>{let t=`select relname, attname, concat(pg_class.oid, '-', attnum) as row_key
50
+ table_name = '${c}' and
51
+ table_schema = '${t.dbSchema}'
52
+ `,{rows:N}=await e.query(w),d=n[c];return{columns:N.map(p=>({name:p.column_name,type:p.data_type,isPrimary:s[c]?.includes(p.column_name),ref:d?.[p.column_name]?{table:d[p.column_name].refTable,field:d[p.column_name].refField}:void 0})).sort((p,h)=>p.isPrimary&&h.isPrimary?p.name.localeCompare(h.name):p.isPrimary?-1:1),createdAt:new Date,tableName:c,updatedAt:new Date}});return Promise.all(i)},Et=async(t,e)=>{let r=`select relname, attname, concat(pg_class.oid, '-', attnum) as row_key
53
53
  from pg_attribute
54
54
  left join pg_class on pg_attribute.attrelid = pg_class.oid
55
55
  where
56
- concat(pg_class.oid, '-', attnum) IN (${a.join(", ")})
57
- limit 25;`;return(await e.query(t)).rows.reduce((s,o)=>(s[o.row_key]={table:o.relname,column:o.attname},s),{})},Ae=async(a,e,t)=>{try{console.log(`[PG CONN] Query: ${a}`);let{rows:r,fields:s,command:o,rowCount:n}=await e.query({text:a,rowMode:"array"});if(o==="UPDATE"||o==="INSERT"||o==="DELETE"){if(n!=null&&n>3&&t.allowBulkUpdate!==!0)throw new Error("[PG CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[n]],query:a}}if(o==="SELECT"){let u=s.map(l=>`'${l.tableID}-${l.columnID}'`),i=await Dt(u,e);return{columns:s.map(l=>{let m=i[`${l.tableID}-${l.columnID}`];return{column:m?.column||l.name,alias:l.name,table:m?.table||"",full:m?m.table+"."+m.column:l.name}}),rows:r,query:a}}throw new Error(`[PG CONN] Unsupported command: ${o}`)}catch(r){throw r instanceof c?r:new c(400,r.message)}},Lt=async(a,e)=>{await a.query("BEGIN");try{let t=await e();return await a.query("COMMIT"),console.log("[PG CONN] Commit"),t}catch(t){throw await a.query("ROLLBACK"),console.log("[PG CONN] Rollback"),t}},_e=async a=>{let e=await Ct(a),t=!1,r=!1,s=async o=>(r||await e.query(`SET search_path TO ${a.dbSchema}`),o());return{dbType:"postgres",dataSource:a,inspectSchema:()=>_t(a,e),executeQuery:(o,n)=>s(()=>n.type==="SELECT"?Ae(o,e,n):Lt(e,()=>Ae(o,e,n))),checkConnection:async()=>{},isClosed:()=>t,close:async()=>{if(!t)return t=!0,e.end()}}};var M=async(a,e)=>{try{let t;if(a.dbType==="mysql")t=await Ce(a);else if(a.dbType==="postgres")t=await _e(a);else throw new c(500,`Connection manager for ${a.dbType} not found`);return e.__connections?e.__connections.push(t):e.__connections=[t],t}catch(t){throw console.error(t),t instanceof c?t:t?.code==="ECONNREFUSED"?new c(500,"Failed to connect to the database"):new c(500,t.message)}};var De=f(a=>{a.get("/:id",async e=>{let{id:t}=h(e),r=await g.findOne({where:{id:t}});if(!r)throw new c(404,"Data source not found");return{data:r}}),a.get("/",async e=>{let{teamId:t}=_(e);return{data:await g.find({where:{team:{id:t}},order:{createdAt:"DESC"}})}}),a.post("/",async(e,t)=>{let{teamId:r,ownerId:s,...o}=y(e,Ie),n=g.create({...o,team:{id:r},owner:{id:s}}),u=await M(n,e);try{await u.checkConnection()}catch{throw new c(400,"Cannot connect to the database, please check datasource configuration")}return{data:await g.save(n)}}),a.put("/:id",async(e,t)=>{let{id:r}=h(e),s=y(e),o=await g.findOneBy({id:r});if(!o)throw new c(404,"Data source not found");let n=g.merge(o,s);return await g.save(n),{data:n}}),a.delete("/:id",async(e,t)=>S.transaction(async()=>{let{id:r}=h(e);await Promise.all([N.delete({datasource:{id:r}}),R.delete({dataSource:{id:r}})]),await g.delete({id:r})})),a.post("/:id/inspect",async(e,t)=>{let{id:r}=h(e),s=await g.findOneBy({id:r});if(!s)throw new Error("Data source not found");s.status="INSPECTING",await g.save(s);let n=await(await M(s,e)).inspectSchema();await N.delete({datasource:{id:r}}),await N.insert(n.sort().map(u=>N.create({tableName:u.tableName,columns:u.columns,datasource:{id:r}}))),s.status="READY",s.lastInspected=new Date,await g.save(s)}),a.get("/:id/inspections",async(e,t)=>{let{id:r}=h(e);return{data:await N.find({where:{datasource:{id:r}}})}})});var se=require("typeorm"),Le=f(a=>{a.get("/team/:teamId/files",async(e,t)=>{let{teamId:r}=h(e),s={where:{team:{id:r}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0}},[o=[],n=[],u=[]]=await Promise.all([g.find(s),b.find({...s,where:{...s.where,isTrash:!1}}),R.find({...s,where:{...s.where,isTrash:!1}})]);return{data:[...o.map(i=>({...i,type:"dataSource"})),...n.map(i=>({...i,type:"workbook"})),...u.map(i=>({...i,type:"query"}))]}}),a.get("/team/:teamId/trash",async e=>{let{teamId:t}=h(e);return{data:await S.query(`
56
+ concat(pg_class.oid, '-', attnum) IN (${t.join(", ")})
57
+ limit 25;`;return(await e.query(r)).rows.reduce((o,n)=>(o[n.row_key]={table:n.relname,column:n.attname},o),{})},Ie=async(t,e,r)=>{try{console.log(`[PG CONN] Query: ${t}`);let{rows:a,fields:o,command:n,rowCount:s}=await e.query({text:t,rowMode:"array"});if(n==="UPDATE"||n==="INSERT"||n==="DELETE"){if(s!=null&&s>3&&r.allowBulkUpdate!==!0)throw new Error("[PG CONN] Bulk update performed without permission.");return{columns:[{column:"affectedRows",alias:"Affected rows",full:"affectedRows"}],rows:[[s]],query:t}}if(n==="SELECT"){let i=o.map(c=>`'${c.tableID}-${c.columnID}'`),m=await Et(i,e);return{columns:o.map(c=>{let w=m[`${c.tableID}-${c.columnID}`];return{column:w?.column||c.name,alias:c.name,table:w?.table||"",full:w?w.table+"."+w.column:c.name}}),rows:a,query:t}}throw new Error(`[PG CONN] Unsupported command: ${n}`)}catch(a){throw a instanceof u?a:new u(400,a.message)}},wt=async(t,e)=>{await t.query("BEGIN");try{let r=await e();return await t.query("COMMIT"),console.log("[PG CONN] Commit"),r}catch(r){throw await t.query("ROLLBACK"),console.log("[PG CONN] Rollback"),r}},Ne=async t=>{let e=await Tt(t),r=!1,a=!1,o=async n=>(a||await e.query(`SET search_path TO ${t.dbSchema}`),n());return{dbType:"postgres",dataSource:t,inspectSchema:()=>ht(t,e),executeQuery:(n,s)=>o(()=>s.type==="SELECT"?Ie(n,e,s):wt(e,()=>Ie(n,e,s))),checkConnection:async()=>{},isClosed:()=>r,close:async()=>{if(!r)return r=!0,e.end()}}};var L=async(t,e)=>{try{let r;if(t.dbType==="mysql")r=await be(t);else if(t.dbType==="postgres")r=await Ne(t);else throw new u(500,`Connection manager for ${t.dbType} not found`);return e.__connections?e.__connections.push(r):e.__connections=[r],r}catch(r){throw console.error(r),r instanceof u?r:r?.code==="ECONNREFUSED"?new u(500,"Failed to connect to the database"):new u(500,r.message)}};var _e=g(t=>{t.get("/:id",async e=>{let{id:r}=S(e),a=await l.findOne({where:{id:r}});if(!a)throw new u(404,"Data source not found");return{data:a}}),t.get("/",async e=>{let{teamId:r}=x(e);return{data:await l.find({where:{team:{id:r}},order:{createdAt:"DESC"}})}}),t.post("/",async(e,r)=>{let{teamId:a,ownerId:o,...n}=f(e,he),s=l.create({...n,team:{id:a},owner:{id:o}}),i=await L(s,e);try{await i.checkConnection()}catch{throw new u(400,"Cannot connect to the database, please check datasource configuration")}return{data:await l.save(s)}}),t.put("/:id",async(e,r)=>{let{id:a}=S(e),o=f(e),n=await l.findOneBy({id:a});if(!n)throw new u(404,"Data source not found");let s=l.merge(n,o);return await l.save(s),{data:s}}),t.delete("/:id",async(e,r)=>T.transaction(async()=>{let{id:a}=S(e);await Promise.all([I.delete({datasource:{id:a}}),E.delete({dataSource:{id:a}})]),await l.delete({id:a})})),t.post("/:id/inspect",async(e,r)=>{let{id:a}=S(e),o=await l.findOneBy({id:a});if(!o)throw new Error("Data source not found");o.status="INSPECTING",await l.save(o);let s=await(await L(o,e)).inspectSchema();await I.delete({datasource:{id:a}}),await I.insert(s.sort().map(i=>I.create({tableName:i.tableName,columns:i.columns,datasource:{id:a}}))),o.status="READY",o.lastInspected=new Date,await l.save(o)}),t.get("/:id/inspections",async(e,r)=>{let{id:a}=S(e);return{data:await I.find({where:{datasource:{id:a}}})}})});var J=require("typeorm"),Ce=g(t=>{t.get("/team/:teamId/files",async(e,r)=>{let{teamId:a}=S(e),o={where:{team:{id:a}},order:{name:"ASC"},select:{id:!0,name:!0,updatedAt:!0}},[n=[],s=[],i=[]]=await Promise.all([l.find(o),ye.find({...o,where:{...o.where,isTrash:!1}}),E.find({...o,where:{...o.where,isTrash:!1}})]);return{data:[...n.map(m=>({...m,type:"dataSource"})),...s.map(m=>({...m,type:"workbook"})),...i.map(m=>({...m,type:"query"}))]}}),t.get("/team/:teamId/trash",async e=>{let{teamId:r}=S(e);return{data:await T.query(`
58
58
  select id, name, updatedAt
59
59
  from workbooks
60
- where teamId = '${t}' AND (isTrash = true OR isTrash IS NULL)
60
+ where teamId = '${r}' AND (isTrash = true OR isTrash IS NULL)
61
61
  order by name asc
62
62
  limit 100;
63
- `)}}),a.get("/team/:teamId/query",async e=>{let{teamId:t}=h(e),{search:r,size:s}=_(e),o=(parseInt(s)||20)/2,[n,u]=await Promise.all([N.find({where:{tableName:(0,se.Like)(`%${r}%`),datasource:{team:{id:t}}},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:o}),R.find({where:{name:(0,se.Like)(`%${r}%`),isTrash:!1,dataSource:{team:{id:t}}},relations:{dataSource:!0},select:{id:!0,name:!0,dataSource:{name:!0,id:!0}},order:{name:"ASC"},take:o})]),i=[];return n.forEach(l=>{i.push({name:l.tableName,id:l.id,dataSourceName:l.datasource?.name||"--",dataSourceId:l.datasource?.id||"--",type:"table"})}),u.forEach(l=>{i.push({name:l.name,id:l.id,dataSourceName:l.dataSource?.name||"--",dataSourceId:l.dataSource?.id||"--",type:"query"})}),{data:i}})});function Y(a,e=void 0){try{if(a){let t=a.split("&"),r={};for(let s of t){let o=s.split(":");r[o[0]]=o[1]}return r}}catch{}return e}var ke=require("typeorm"),Ue=f(a=>{a.get("/",async e=>{let{dataSourceId:t,teamId:r,limit:s,orderBy:o,name:n}=_(e);if(!t&&!r)throw new c(400,"Either dsId or teamId is required");let u={isTrash:!1};return t&&(u.dataSource={id:t}),r&&(u.team={id:r}),n&&(u.name=(0,ke.Like)(`%${n}%`)),{data:await R.find({where:u,take:s,order:Y(o,{createdAt:"DESC"})})}}),a.get("/:id",async e=>{let{id:t}=h(e),r=await R.findOne({where:{id:t},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return r?{data:r}:{status:404,data:"Query not found"}}),a.post("/",async e=>{let t=y(e),r=await g.findOne({where:{id:t.dataSourceId},relations:{team:!0}});return{data:await R.save(R.create({name:t.name,isTrash:!1,opts:t.opts,team:{id:r?.team.id},dataSource:{id:t.dataSourceId}}))}}),a.patch("/:id",async e=>{let{id:t}=h(e),r=y(e);if(!(await R.update(t,r)).affected)throw new c(404,"Workbook not found");return{data:await R.findOneBy({id:t})}}),a.delete("/:id",async e=>S.transaction(async()=>{let{id:t}=h(e);if(!(await R.delete({id:t})).affected)return{status:404,data:"Workbook not found"}}))});var Ge=P($e()),Ke=require("typeorm");function We(a,e,t){return`${a.replace(/;\s*$/,"").trim()} LIMIT ${e} OFFSET ${t}`}function Be(a,e){return a.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g,(t,r)=>{if(!(r in e))throw new Error(`Missing value for SQL variable: ${r}`);return String(e[r])})}function je(a){let t=a.replace(/--.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"").trim().match(/^\s*(\(?\s*)*([a-zA-Z]+)/);if(!t)throw new c(400,"Failed to detect query type");return t[2].toUpperCase()}var He=[{value:"=",label:"equals"},{value:"<>",label:"not equal"},{value:">",label:"greater than"},{value:">=",label:"greater than or equal"},{value:"<",label:"less than"},{value:"<=",label:"less than or equal"},{value:"LIKE",label:"contains"},{value:"NOT LIKE",label:"not contains"},{value:"ILIKE",label:"case-insensitive contains"},{value:"NOT ILIKE",label:"case-insensitive not contains"},{value:"IN",label:"in list"},{value:"NOT IN",label:"not in list"},{value:"IS NULL",label:"is null"},{value:"IS NOT NULL",label:"is not null"}],qt=He.reduce((a,e)=>(a[e.value]=e.label,a),{}),ra=He.reduce((a,e)=>(a[e.label]=e.value,a),{}),x=a=>a.map(e=>({label:qt[e],value:e})),aa=x(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),sa=x(["=","<>","LIKE","NOT LIKE","ILIKE","NOT ILIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),oa=x(["=","<>","IS NULL","IS NOT NULL"]),na=x(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),ia=x(["IS NULL","IS NOT NULL"]),ua=x(["IN","NOT IN"]);var Ye=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"];function Mt(a){return a||20}function xt(a){return a||0}function vt(a){return a.includes(" ")&&!a.startsWith("'")?`\`${a}\``:a}var Ve=async(a,{table:e,variables:t,datasourceId:r,filters:s,joins:o,orderBy:n,size:u,page:i,columns:l,groupBy:m,searchAll:E})=>{let p=await g.findOneBy({id:r}),d=[],U=[];if(!p)throw new c(404,"Data source not found");let w=new Ge.SQLManipulator(p.dbType,"SELECT");if(w.setTable(e),t&&w.setParameters(t),w.getParsed().type!=="SELECT")throw new c(400,"Only SELECT queries are allowed in this endpoint");w.setLimit(u||20),w.setOffset(u*i),s?.forEach(T=>{w.addWhere(Ft(T))}),o&&w.addJoin(...o),n&&w.addOrderBy(...n.map(T=>({...T,column:vt(T.column)}))),m&&m.length>0&&m.forEach(T=>w.addGroupBy(T));let F=w.getParsed();F.table&&d.push(F.table),F.joins&&F.joins.length>0&&F.joins.forEach(T=>{d.push(T.table)});let ct=await N.find({where:{tableName:(0,Ke.In)(d),datasource:{id:r}}});for(let T of ct)if(T.columns)for(let A of T.columns)U.push({column:A.name,table:T.tableName||"",full:`${T.tableName}.${A.name}`,type:A.type});let W;if(l&&l.length>0?W=l:W=U.map(T=>T.full),w.selectColumns(W),E){let T=U.filter(A=>Ye.includes(A.type)&&W.includes(A.full));if(T.length>0){let A=T.map(lt=>`LOWER(${lt.full}) LIKE '%${E.toLowerCase()}%'`);w.addWhereRaw(`(${A.join(" OR ")})`,"AND")}}return{...await(await M(p,a)).executeQuery(w.toExecutableSQL(),{type:w.getParsed().type,allowBulkUpdate:!1}),tables:d,allColumns:U}},ze=async(a,{sql:e,variables:t,datasourceId:r,size:s,page:o})=>{let n=await g.findOneBy({id:r});if(!n)throw new c(404,"Data source not found");let u=je(e),i=e;if(u==="SELECT"){if(i.match(/LIMIT|OFFSET/ig))throw new c(400,"Queries are automatically paginated, do not use LIMIT and/or OFFSET");let m=Mt(s);i=We(i,m,m*xt(o))}return t&&(i=Be(i,t)),(await M(n,a)).executeQuery(i,{type:u,allowBulkUpdate:!1})};function Ft(a){let e={...a};switch(e.operator){case"IS NULL":case"IS NOT NULL":e.value=void 0;break;case"LIKE":case"ILIKE":case"NOT LIKE":case"NOT ILIKE":e.value=e.value?.map(t=>({isColumn:t?.isColumn,value:`%${t?.value}%`}));break}return e}var Je=f(a=>{a.post("/sql",async e=>{let t=y(e);return{data:await Ve(e,t)}}),a.post("/raw",async e=>{let t=y(e);return{data:await ze(e,t)}})});var Ze=require("node:child_process"),Xe=f(a=>{a.get("/",async(e,t)=>({data:{active:!0,version:process.env.SERVER_VERSION}})),a.get("/logs",async()=>{(0,Ze.spawn)(`echo "${process.env.SERVER_VERSION}"`)})});var et=f(a=>{a.get("/",async(e,t)=>{let r=D(e);return{data:await q.find({where:{users:{id:r}}})}}),a.post("/",async(e,t)=>S.transaction(async()=>{let r=D(e),s=y(e),o=I.create();o.id=r;let n=q.create(s);return n.users=[o],await q.save(n),{data:n}}))});var tt=async a=>({email:"local@localhost",sub:"local"});async function rt(){let a=q.create({name:"Personal"}),e=await I.save(I.create({}));return a.users=[e],await q.save(a),await I.update(e.id,{currentTeam:{id:a.id}}),I.findOne({where:{},relations:{currentTeam:!0}})}var at=f(a=>{a.post("/register",async(e,t)=>{let r=await tt(e);if(!r?.email||!r?.sub)throw new c(400,"Invalid token");return{data:await rt()}}),a.get("/",async(e,t)=>{let r=await I.findOne({where:{},relations:{currentTeam:!0}});return r?{data:r}:{data:await rt()}}),a.put("/",async(e,t)=>{let r=D(e),s=y(e);if(!(await I.update(r,s)).affected)throw new c(404,"User not found");return{data:I.findOneBy({id:r})}}),a.put("/team",async(e,t)=>{let r=D(e),s=y(e);return await I.update(r,{currentTeam:{id:s.teamId}}),{data:await I.findOne({where:{id:r},relations:{currentTeam:!0}})}})});var Qt="********************************************",st=a=>a.slice(0,4)+Qt+a.slice(a.length-4);function $t(a){let e=C.create(a);return a.openAiToken&&(e.openAiToken=st(a.openAiToken)),e}var ot=f(a=>{a.get("/",async e=>{let t=D(e),r=await C.findOneBy({user:{id:t}});return r||(r=await C.save(C.create({user:{id:t},model:"gpt-4o"}))),{data:$t(r)}}),a.patch("/",async e=>{let{settings:t}=y(e);if(!t.id)throw new c(400,"Settings id is required!");if(!(await C.update(t.id,t)).affected)throw new c(404,"You do not own these settings!");return{data:await C.findOneBy({id:t.id})}})});var nt=f(a=>{a.get("/",async e=>{let{dsId:t,teamId:r,limit:s,orderBy:o}=_(e);if(!t&&!r)throw new c(400,"Either dsId or teamId is required");return{data:await b.find({where:{team:{id:r},isTrash:!1},take:s,order:Y(o,{createdAt:"DESC"})})}}),a.get("/:id",async e=>{let{id:t}=h(e),r=await b.findOneBy({id:t});return r?{data:r}:{status:404,data:"Workbook not found"}}),a.post("/",async e=>{let t=y(e);return{data:await b.save(b.create({name:t.name,isTrash:!1,team:{id:t.teamId}}))}}),a.patch("/:id",async e=>{let{id:t}=h(e),r=y(e);if(!(await b.update(t,r)).affected)throw new c(404,"Workbook not found");return{data:await b.findOneBy({id:t})}}),a.delete("/:id",async e=>{let{id:t}=h(e);if(!(await b.delete({id:t})).affected)return{status:404,data:"Workbook not found"}}),a.get("/:id/content",async e=>{let{id:t}=h(e),r=await b.findOneBy({id:t});if(!r)throw new c(404,"Workbook not found");try{let s=await Se(r?.path);if(s)return{data:s}}catch{}return{data:""}}),a.patch("/:id/content",async e=>{let{id:t}=h(e),r=y(e),s=await b.findOneBy({id:t});if(!s?.path)throw new c(404,"Workbook not found");await we(s?.path,r.content),await b.update(s.id,{updatedAt:new Date})})});var v=(0,it.default)(),Wt=process.env.PORT?parseInt(process.env.PORT):4466;function O(a,e){v.register(a,{prefix:e}),console.log("Registered "+e)}async function Bt(){await be(),O(Re,"/api/chat"),O(De,"/api/data-sources"),O(Le,"/api/project"),O(Ue,"/api/queries"),O(Je,"/api/runner"),O(Xe,"/api/status"),O(et,"/api/teams"),O(at,"/api/users"),O(ot,"/api/user-settings"),O(nt,"/api/workbooks"),v.register(ut.default,{origin:"*",methods:"*"}),v.addHook("onResponse",async a=>{a.__connections&&a.__connections.forEach(e=>{e.close()})}),v.setErrorHandler((a,e,t)=>{if(a instanceof c){console.error(a),t.status(a.status).send({error:a.message});return}else console.error(a),t.status(500).send({error:"Internal Server Error"})}),await v.after(),await ge(),v.listen({port:Wt,host:"0.0.0.0"},(a,e)=>{a&&(console.error(a),process.exit(1)),console.log(`Server listening at ${e}`)})}Bt();
63
+ `)}}),t.get("/team/:teamId/query",async e=>{let{teamId:r}=S(e),{search:a,size:o}=x(e),n=(parseInt(o)||20)/2,[s,i]=await Promise.all([I.find({where:{tableName:(0,J.Like)(`%${a}%`),datasource:{team:{id:r}}},relations:{datasource:!0},select:{id:!0,tableName:!0,datasource:{name:!0,id:!0}},order:{tableName:"ASC"},take:n}),E.find({where:{name:(0,J.Like)(`%${a}%`),isTrash:!1,dataSource:{team:{id:r}}},relations:{dataSource:!0},select:{id:!0,name:!0,dataSource:{name:!0,id:!0}},order:{name:"ASC"},take:n})]),m=[];return s.forEach(c=>{m.push({name:c.tableName,id:c.id,dataSourceName:c.datasource?.name||"--",dataSourceId:c.datasource?.id||"--",type:"table"})}),i.forEach(c=>{m.push({name:c.name,id:c.id,dataSourceName:c.dataSource?.name||"--",dataSourceId:c.dataSource?.id||"--",type:"query"})}),{data:m}})});function Oe(t,e=void 0){try{if(t){let r=t.split("&"),a={};for(let o of r){let n=o.split(":");a[n[0]]=n[1]}return a}}catch{}return e}var Ae=require("typeorm"),De=g(t=>{t.get("/",async e=>{let{dataSourceId:r,teamId:a,limit:o,orderBy:n,name:s}=x(e);if(!r&&!a)throw new u(400,"Either dsId or teamId is required");let i={isTrash:!1};return r&&(i.dataSource={id:r}),a&&(i.team={id:a}),s&&(i.name=(0,Ae.Like)(`%${s}%`)),{data:await E.find({where:i,take:o,order:Oe(n,{createdAt:"DESC"})})}}),t.get("/:id",async e=>{let{id:r}=S(e),a=await E.findOne({where:{id:r},select:{dataSource:{id:!0}},relations:{dataSource:!0}});return a?{data:a}:{status:404,data:"Query not found"}}),t.post("/",async e=>{let r=f(e),a=await l.findOne({where:{id:r.dataSourceId},relations:{team:!0}});return{data:await E.save(E.create({name:r.name,isTrash:!1,opts:r.opts,team:{id:a?.team.id},dataSource:{id:r.dataSourceId}}))}}),t.patch("/:id",async e=>{let{id:r}=S(e),a=f(e);if(!(await E.update(r,a)).affected)throw new u(404,"Workbook not found");return{data:await E.findOneBy({id:r})}}),t.delete("/:id",async e=>T.transaction(async()=>{let{id:r}=S(e);if(!(await E.delete({id:r})).affected)return{status:404,data:"Workbook not found"}}))});var F=_(xe()),qe=require("typeorm");var ve=[{value:"=",label:"equals"},{value:"<>",label:"not equal"},{value:">",label:"greater than"},{value:">=",label:"greater than or equal"},{value:"<",label:"less than"},{value:"<=",label:"less than or equal"},{value:"LIKE",label:"contains"},{value:"NOT LIKE",label:"not contains"},{value:"ILIKE",label:"case-insensitive contains"},{value:"NOT ILIKE",label:"case-insensitive not contains"},{value:"IN",label:"in list"},{value:"NOT IN",label:"not in list"},{value:"IS NULL",label:"is null"},{value:"IS NOT NULL",label:"is not null"}],_t=ve.reduce((t,e)=>(t[e.value]=e.label,t),{}),qr=ve.reduce((t,e)=>(t[e.label]=e.value,t),{}),v=t=>t.map(e=>({label:_t[e],value:e})),Qr=v(["=","<>",">",">=","<","<=","IN","NOT IN","IS NULL","IS NOT NULL"]),$r=v(["=","<>","LIKE","NOT LIKE","ILIKE","NOT ILIKE","IN","NOT IN","IS NULL","IS NOT NULL"]),Br=v(["=","<>","IS NULL","IS NOT NULL"]),Fr=v(["=","<>",">",">=","<","<=","IS NULL","IS NOT NULL"]),Wr=v(["IS NULL","IS NOT NULL"]),jr=v(["IN","NOT IN"]);var ke=["char","varchar","binary","varbinary","blob","text","enum","set","character","character varying","text","citext","uuid","xml","json","jsonb"];function Ct(t){return t.includes(" ")&&!t.startsWith("'")?`\`${t}\``:t}var te=async(t,{table:e,datasourceId:r,filters:a,joins:o,orderBy:n,size:s,page:i,columns:m,groupBy:c,searchAll:w})=>{let N=await l.findOneBy({id:r}),d=[e],p=[];if(!N)throw new u(404,"Data source not found");let h=new F.SelectQueryBuilder(N.dbType);h.setTable(e),h.setLimit(s||20),h.setOffset(s*i),a?.forEach(y=>{h.addWhere(At(y))}),o&&(h.addJoin(...o),o.forEach(y=>{d.push(y.table)})),n&&h.addOrderBy(...n.map(y=>({...y,column:Ct(y.column)}))),c&&c.length>0&&c.forEach(y=>h.addGroupBy(y));let Xe=await I.find({where:{tableName:(0,qe.In)(d),datasource:{id:r}}});for(let y of Xe)if(y.columns)for(let O of y.columns)p.push({column:O.name,table:y.tableName||"",full:`${y.tableName}.${O.name}`,type:O.type});let k;if(m&&m.length>0?k=m:k=p.map(y=>y.full),h.selectColumns(k),w){let y=p.filter(O=>ke.includes(O.type)&&k.includes(O.full));if(y.length>0){let O=y.map(et=>`LOWER(${et.full}) LIKE '%${w.toLowerCase()}%'`);h.addWhereRaw(`(${O.join(" OR ")})`,"AND")}}return{...await(await L(N,t)).executeQuery(h.toSQL(),{type:"SELECT",allowBulkUpdate:!1}),tables:d,allColumns:p}},Qe=async(t,e)=>{let r=await l.findOneBy({id:e.datasourceId});if(!r)throw new u(404,"Data source not found");let a=e.values.map(({value:i,column:m})=>typeof i=="string"?i&&i.startsWith("=")?`${m}=${i.substring(1)}`:`${m}='${i}'`:`${m}='${i}'`).join(", "),o=e.filters.map(F.buildWhereCondition).join(" AND "),n=`UPDATE ${e.table} SET ${a} WHERE ${o}`;return(await L(r,t)).executeQuery(n,{type:"UPDATE",allowBulkUpdate:!1})},$e=async(t,e)=>{let r=await l.findOneBy({id:e.datasourceId});if(!r)throw new u(404,"Data source not found");let{keys:a,values:o}=Ot(e.values),n=`INSERT INTO ${e.table} (${a}) VALUES (${o})`;return(await L(r,t)).executeQuery(n,{type:"INSERT",allowBulkUpdate:!1})},Ot=t=>{let e=t.map(({column:a})=>a).join(", "),r=t.map(({value:a})=>typeof a=="string"?a&&a.startsWith("=")?a.substring(1):`'${a}'`:a).join(", ");return{keys:e,values:r}},At=t=>{let e={...t};switch(e.operator){case"IS NULL":case"IS NOT NULL":e.value=void 0;break;case"LIKE":case"ILIKE":case"NOT LIKE":case"NOT ILIKE":e.value=e.value?.map(r=>({isColumn:r?.isColumn,value:`%${r?.value}%`}));break}return e};var Be=g(t=>{t.post("/sql",async e=>{let r=f(e);return{data:await te(e,r)}}),t.post("/select",async e=>{let r=f(e);return{data:await te(e,r)}}),t.post("/insert",async e=>{let r=f(e);return{data:await $e(e,r)}}),t.post("/update",async e=>{let r=f(e);return{data:await Qe(e,r)}})});var Fe=require("node:child_process"),We=g(t=>{t.get("/",async(e,r)=>({data:{active:!0,version:process.env.SERVER_VERSION}})),t.get("/logs",async()=>{(0,Fe.spawn)(`echo "${process.env.SERVER_VERSION}"`)})});var je=g(t=>{t.get("/",async(e,r)=>{let a=A(e);return{data:await U.find({where:{users:{id:a}}})}}),t.post("/",async(e,r)=>T.transaction(async()=>{let a=A(e),o=f(e),n=b.create();n.id=a;let s=U.create(o);return s.users=[n],await U.save(s),{data:s}}))});async function Dt(){let t=U.create({name:"Personal"}),e=await b.save(b.create({}));return t.users=[e],await U.save(t),await b.update(e.id,{currentTeam:{id:t.id}}),b.findOne({where:{},relations:{currentTeam:!0}})}var Ye=g(t=>{t.get("/",async(e,r)=>{let a=await b.findOne({where:{},relations:{currentTeam:!0}});return a?{data:a}:{data:await Dt()}}),t.put("/",async(e,r)=>{let a=A(e),o=f(e);if(!(await b.update(a,o)).affected)throw new u(404,"User not found");return{data:b.findOneBy({id:a})}}),t.put("/team",async(e,r)=>{let a=A(e),o=f(e);return await b.update(a,{currentTeam:{id:o.teamId}}),{data:await b.findOne({where:{id:a},relations:{currentTeam:!0}})}})});var Pt="********************************************",He=t=>t.slice(0,4)+Pt+t.slice(t.length-4);function Ut(t){let e=M.create(t);return t.openAiToken&&(e.openAiToken=He(t.openAiToken)),e}var Ge=g(t=>{t.get("/",async e=>{let r=A(e),a=await M.findOneBy({user:{id:r}});return a||(a=await M.save(M.create({user:{id:r},model:"gpt-4o"}))),{data:Ut(a)}}),t.patch("/",async e=>{let{settings:r}=f(e);if(!r.id)throw new u(400,"Settings id is required!");if(!(await M.update(r.id,r)).affected)throw new u(404,"You do not own these settings!");return{data:await M.findOneBy({id:r.id})}})});var Je=require("node:path"),P=(0,Ke.default)(),Ze=process.env.PORT?parseInt(process.env.PORT):4466,Mt=["https://app.dataramen.xyz","https://dataramen.xyz","http://localhost:3000","http://localhost:3001",`http://localhost:${Ze}`];function D(t,e){P.register(t,{prefix:e}),console.log("Registered "+e)}async function Lt(){await Se(),D(_e,"/api/data-sources"),D(Ce,"/api/project"),D(De,"/api/queries"),D(Be,"/api/runner"),D(We,"/api/status"),D(je,"/api/teams"),D(Ye,"/api/users"),D(Ge,"/api/user-settings"),P.register(Ve.default,{root:(0,Je.join)(__dirname,"web")}),P.get("/",(t,e)=>{e.sendFile("index.html")}),P.register(ze.default,{origin:(t,e)=>{!t||Mt.includes(t)?e(null,!0):e(new Error("Not allowed by CORS"),!1)},methods:"*"}),P.addHook("onResponse",async t=>{t.__connections&&t.__connections.forEach(e=>{e.close()})}),P.setErrorHandler((t,e,r)=>{if(t instanceof u){console.error(t),r.status(t.status).send({error:t.message});return}else console.error(t),r.status(500).send({error:"Internal Server Error"})}),await P.after(),await pe(),P.listen({port:Ze,host:"127.0.0.1"},(t,e)=>{t&&(console.error(t),process.exit(1)),console.log(`Server listening at ${e}`)})}Lt();